Reply To: Modify Packet

Home Forums Discussions Support Modify Packet Reply To: Modify Packet

#5439
Vadim Smirnov
Keymaster

    You should use something like the code below. Also if modify IP header you should recalculate IP checksum, if modify UDP packet you should recalculate UDP checksum…

    VOID
    RecalculateTCPChecksum (
    PINTERMEDIATE_BUFFER pPacket
    )
    {
    tcphdr_ptr pTcpHeader = NULL;
    unsigned short word16, padd = 0;
    unsigned int i, sum = 0;
    PUCHAR buff;
    DWORD dwTcpLen;

    iphdr_ptr pIpHeader = (iphdr_ptr)&pPacket->m_IBuffer[sizeof(ether_header)];

    // Sanity check
    if (pIpHeader->ip_p == IPPROTO_TCP)
    {
    pTcpHeader = (tcphdr_ptr)(((PUCHAR)pIpHeader) + sizeof(DWORD)*pIpHeader->ip_hl);
    }
    else
    return;

    dwTcpLen = ntohs(pIpHeader->ip_len) - pIpHeader->ip_hl*4;//pPacket->m_Length - ((PUCHAR)(pTcpHeader) - pPacket->m_IBuffer);

    if ( (dwTcpLen/2)*2 != dwTcpLen )
    {
    padd=1;
    pPacket->m_IBuffer[dwTcpLen + pIpHeader->ip_hl*4 + sizeof(ether_header)] = 0;
    }

    buff = (PUCHAR)pTcpHeader;
    pTcpHeader->th_sum = 0;

    // make 16 bit words out of every two adjacent 8 bit words and
    // calculate the sum of all 16 vit words
    for (i=0; i< dwTcpLen+padd; i=i+2){
    word16 =((buff<<8)&0xFF00)+(buff[i+1]&0xFF);
    sum = sum + (unsigned long)word16;
    }

    // add the TCP pseudo header which contains:
    // the IP source and destination addresses,

    sum = sum + ntohs(pIpHeader->ip_src.S_un.S_un_w.s_w1) + ntohs(pIpHeader->ip_src.S_un.S_un_w.s_w2);
    sum = sum + ntohs(pIpHeader->ip_dst.S_un.S_un_w.s_w1) + ntohs(pIpHeader->ip_dst.S_un.S_un_w.s_w2);

    // the protocol number and the length of the TCP packet
    sum = sum + IPPROTO_TCP + (unsigned short)dwTcpLen;

    // keep only the last 16 bits of the 32 bit calculated sum and add the carries
    while (sum>>16)
    sum = (sum & 0xFFFF)+(sum >> 16);

    // Take the one's complement of sum
    sum = ~sum;

    pTcpHeader->th_sum = ntohs((unsigned short)sum);
    }