AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
阅读:1363回复:6

关于IP数据报的校验在中间层驱动的计算问题

楼主#
更多 发布于:2002-08-01 17:02
我写了一个中间层NDIS驱动,来修改IP头,因此需要重新计算校验,我按这样计算,将IP头的所有字节(包括选项)
具体方法如下:

//pbSrc IP报头信息
//pbDest 保存计算后的头信息
//nLen  IP报头信息长
void CheckSum(unsigned char *pbSrc , int nLen , unsigned char *pbDest)
{
int i ;
PWORD pwData ;
WORD wCheckSum = 0;

for(i=0;i<nLen;)
{
pbDest = pbSrc[i+1] ;
pbDest[i+1] = pbSrc ;
i = i+2 ;
}
pwData = (PWORD)pbDest ;
pwData[5] = 0 ;
nLen = nLen>>1 ;
for(i=0;i<nLen;i++)
{
wCheckSum = wCheckSum+ (~pwData) ;
}
pwData[5] = ~wCheckSum ;
}

但是这样计算的结果不等于原来IP报头信息中的CheckSum.
请问各位,我错在什么地方了
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-01 17:26
呵呵,你改了ip头,当然checksum就不一样了!

但重新计算前要把原来的checksum清0!
fenger_li
驱动老牛
驱动老牛
  • 注册日期2002-03-26
  • 最后登录2005-04-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-01 23:24
你算的不对。

建议你下个标准的算法吧。

嗬嗬!
有点意思。。。 呵呵!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-02 10:12
呵呵,你改了ip头,当然checksum就不一样了!

但重新计算前要把原来的checksum清0!


我上面的函数只是计算CheckSum是否等于IP 头中的CheckSum,
我首先将数据备份到pbDest中,并且在
pwData[5] = 0 ;
中将CheckSum清0,
可是计算后的CheckSum不等于我得到的包中的CheckSum,我是通过2000的网络监视软件来得到的数据,然后在计算的。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-02 10:25
你算的不对。

建议你下个标准的算法吧。

嗬嗬!


我是按照RFC标准计算的,
按以下几步:
对于发送端
1、将数分为k部分,每部分n比特。
2、将校验和清0。
3、用反码运算将所有这些部分相加。
4、将结果取反。
5、结果写到校验和中。

我是那步错了,请兄弟告知
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
fenger_li
驱动老牛
驱动老牛
  • 注册日期2002-03-26
  • 最后登录2005-04-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-02 11:36
反码?

hehe

USHORT iphdr_cksum(USHORT *iph)
{
    USHORT i;
    ULONG sum;

    i = 0;
    sum = 0;

    while(i++ < (sizeof(IP_HEADER)/2))
        sum += *iph++;

    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    sum = ~sum;

    return (USHORT)sum;
}
估计能,看明白了吧。那就用它吧。

嗬嗬!
有点意思。。。 呵呵!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-02 12:01
反码?

hehe

USHORT iphdr_cksum(USHORT *iph)
{
    USHORT i;
    ULONG sum;

    i = 0;
    sum = 0;

    while(i++ < (sizeof(IP_HEADER)/2))
        sum += *iph++;

    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    sum = ~sum;

    return (USHORT)sum;
}
估计能,看明白了吧。那就用它吧。

嗬嗬!


多谢大狭指点
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部