小弟用raw socket截获ip包后,修改目标ip地址,然后再发送出去,发送的时候总是出错,我查了一下以前的贴子,可能是要修改校验和的原因,请问怎么修改呀?还要修改其他的东西么?哪位大虾有这方面的源代码么?

解决方案 »

  1.   

    需要修改 checksum。是 TCP 的还是 UDP 的?
      

  2.   

    RFC里面有个大众算法,
    我忘记在哪里了,应该是在说NAT的哪一篇
      

  3.   

    是TCP的,是哪个RFC呀,有源代码么?
      

  4.   

    raw socket只能窃听数据包吧
    不能截获
    你重发一次tcp包有什么意义?
      

  5.   

    unsigned short getChecksum( char* buf, int size )
    {
    unsigned long cksum = 0l;
    unsigned short* data = (unsigned short*) buf; while( size >= sizeof(unsigned short) )
    {
    cksum += *data;
    data++;
    size -= sizeof( unsigned short );
    }
    if( size == 1 )
    {
    cksum += *((unsigned char*)data);
    } cksum = (cksum >> 16) + (cksum & 0xFFFF);
    cksum += (cksum >> 16); return ((unsigned short)(~cksum));
    }在计算IP头的校验码时,首先要把校验码字段置为0,然后计算
      

  6.   

    USHORT checksum(USHORT *buffer, int size) 

      unsigned long cksum=0; 
      while (size > 1) 
      { 
        cksum += *buffer++; 
        size -= sizeof(USHORT);   
      } 
      if (size) 
      { 
        cksum += *(UCHAR*)buffer;   
      } 
      cksum = (cksum >> 16) + (cksum & 0xffff); 
      cksum += (cksum >>16); 
      return (USHORT)(~cksum); 
    }
      

  7.   

    我是想实现将发给机器A的ip包的目标ip地址修改为机器B的ip地址后,然后转发,请问机器B能收到么?(是TCP协议。)
      

  8.   

    tcp是三次握手的,是握手包的话可以发送得到,例如syn洪水攻击就是这样了如果不是的话,你要算出那个序列号才可以让目标主机不丢弃这个数据包,算出这个序列号的话比较困难,有些牛人可以算得出,我算不出
      

  9.   

    这么说NAT只能实现UDP了,不能实现TCP,是不是这样理解的呀?小弟是新手。
      

  10.   

    1、注意IP的校验和和TCP的校验和计算
    2、既然你是做双向转发,注意分别针对两边的序号和确认号的连续性。
    3、选择方便的sniffer软件来调试,推荐iris,可以帮助你检查和计算校验和。
      

  11.   

    WinXPSP2下RAW_SOCKET的使用有很大的限制,只能用来发IP地址合法的UDP数据。参见Windows XP SP2文档