storybaby
驱动牛犊
驱动牛犊
  • 注册日期2006-08-12
  • 最后登录2009-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
阅读:1669回复:2

如果将TCP的数据字段修改后,除了计算校验和以外,还需要计算哪些字段呢?

楼主#
更多 发布于:2007-08-12 17:19
我把发送的包抓住后,放在一个buffer中,然后将TCP的数据字段修改后再重新计算IP和TCP的校验和发送出去,对方就不能够成功接收数据;如果我不修改TCP的数据字段,但是还是重新计算IP和TCP校验和,然后把包发送出去,对方就能够成功接收到数据.
请问我的问题出在哪儿?

为表感谢,我奉献一段计算校验和的代码:
USHORT CalculateIPChecksum(PVOID pBuffer,UCHAR Flag)
{
    long Checksum=0;UCHAR* pBuf=(UCHAR*)pBuffer;

    USHORT BufferLen=((*(UCHAR*)pBuffer)&0xf)<<2;

    if(Flag == 1)
    {
        DbgPrint(" re CalculateIPChecksum !!\n");
    }
    if (Flag==1)
        *((USHORT*)pBuffer+5)=0;

    while(BufferLen>1)
    {
        Checksum+=*(USHORT*)pBuffer;
        pBuffer=(UCHAR*)pBuffer+2;
        BufferLen-=2;
    }

    if(BufferLen)
        Checksum+=*(UCHAR*)pBuffer;

    while(Checksum>>16)
        Checksum=(Checksum & 0xffff) + (Checksum>>16);
    Checksum=~Checksum;

    if (Flag==1)
        *((USHORT*)pBuf+5)=(USHORT)Checksum;

    return (USHORT)Checksum;
}

USHORT CalculateTcpChecksum(void* IPBuf,UCHAR Flag)//传入IP头
{
    ULONG Checksum;
    UCHAR IPHeadLen;
    UCHAR *TCPBuf,*TCPBuf2;
    USHORT TCPLen;
    
    if (*((USHORT*)IPBuf+3)&0xff1f)
        return 0;

    IPHeadLen=(*(UCHAR*)IPBuf&0X0F)*4;
    TCPBuf2=TCPBuf=(UCHAR*)IPBuf+IPHeadLen;
    
    TCPLen=((*((UCHAR*)IPBuf+2)<<8)+*((UCHAR*)IPBuf+3))-IPHeadLen;
    
    if (Flag==1)
        *(USHORT*)(TCPBuf+16)=0;

    Checksum=(USHORT)(TCPLen<<8)+(TCPLen>>8);      //TCP Length
    Checksum+=*((UCHAR*)IPBuf+9)<<8;          //Protol Code
    Checksum+=*(USHORT*)((UCHAR*)IPBuf+12);               //Src Address
    Checksum+=*(USHORT*)((UCHAR*)IPBuf+14);
    Checksum+=*(USHORT*)((UCHAR*)IPBuf+16);               //Dst Address
    Checksum+=*(USHORT*)((UCHAR*)IPBuf+18);
    
    while(TCPLen>1)
    {
        Checksum+=*(USHORT*)TCPBuf;
        TCPBuf+=2;TCPLen-=2;
    }
    if (TCPLen) Checksum+=*TCPBuf;
    
    Checksum=(Checksum&0XFFFF)+(Checksum>>16);
    Checksum=(Checksum&0XFFFF)+(Checksum>>16);
    Checksum=~Checksum;

    if (Flag==1)
        *(USHORT*)(TCPBuf2+16)=(USHORT)Checksum;

    return (USHORT)Checksum;
}

谢谢,高手为我指点迷津!
jamesking
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望53点
  • 贡献值1点
  • 好评度13点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-13 06:27
建议你用抓包工具在对方电脑上抓包看一下,像Ethereal、SnifferPro、IrIs都有数据包校验码自动计算功能。
1、首先确定你修改过的数据包已经到了对方的电脑上。
2、看一下你发过去的数据包校验码是否计算正确。
3、检查你发过去的数据包是否符合已经建立的TCP连接,如tcp序列号、应答号、窗口大小等等。
storybaby
驱动牛犊
驱动牛犊
  • 注册日期2006-08-12
  • 最后登录2009-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-13 20:39
大侠,  我通过抓包已经确定的是,我的数据已经发送到对方机器上,但是对方一直没有向我发送应答消息,导致我本机发送出去的数据会发送五次,抓包程序在对方机器上显示我的数据已经到了5次.因为是基于TCP的测试,所以对方没有向我发确认消息,本机就会再将数据发多次.
请问这个是我的哪个字段没有处理好,导致出现这种情况呢?
游客

返回顶部