阅读:1669回复:2
如果将TCP的数据字段修改后,除了计算校验和以外,还需要计算哪些字段呢?
我把发送的包抓住后,放在一个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; } 谢谢,高手为我指点迷津! |
|
沙发#
发布于:2007-08-13 06:27
建议你用抓包工具在对方电脑上抓包看一下,像Ethereal、SnifferPro、IrIs都有数据包校验码自动计算功能。
1、首先确定你修改过的数据包已经到了对方的电脑上。 2、看一下你发过去的数据包校验码是否计算正确。 3、检查你发过去的数据包是否符合已经建立的TCP连接,如tcp序列号、应答号、窗口大小等等。 |
|
板凳#
发布于:2007-08-13 20:39
大侠, 我通过抓包已经确定的是,我的数据已经发送到对方机器上,但是对方一直没有向我发送应答消息,导致我本机发送出去的数据会发送五次,抓包程序在对方机器上显示我的数据已经到了5次.因为是基于TCP的测试,所以对方没有向我发确认消息,本机就会再将数据发多次.
请问这个是我的哪个字段没有处理好,导致出现这种情况呢? |
|