关于checksum校检和的计算.

endicking 2004-05-09 02:13:39
通常ip,或者,tcp,udp的校检和要先统计整个ip头,或者整个tcp,udp数据包的数据.
我有个想法,我截获了数据包,并改动了源地址,目标地址
但是我不想再重新统计整个数据包来计算checksum了,我想在原来的checksum基础上
根据我改的源地址和目标地址的改变偏移来计算checksum,不知道这可不可以

但是我发现checksum的函数经过了移位,会有数据丢失,有那位大侠有高招能够很好的处理这些问题呢?

标准checksum计算函数
USHORT CNetwork::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);
}
...全文
361 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
agent 2004-05-10
  • 打赏
  • 举报
回复
改变部分的数据
endicking 2004-05-10
  • 打赏
  • 举报
回复
谢谢兄弟,结分
endicking 2004-05-09
  • 打赏
  • 举报
回复
没有人帮帮我吗?
endicking 2004-05-09
  • 打赏
  • 举报
回复
谢谢楼上的仗义相助,
但是有个别参数的意义没明

optr,nptr是指向整个ip包的指针,还是指向改变数据的部分?
agent 2004-05-09
  • 打赏
  • 举报
回复
涉及的协议包括:IP、UDP、TCP、ICMP。
关键是计算出修改前后的校验和的差值,代码如下:

void checksumadjust(unsigned char *chksum, unsigned char *optr,
int olen, unsigned char *nptr, int nlen)
/* assuming: unsigned char is 8 bits, long is 32 bits.
- chksum points to the chksum in the packet
- optr points to the old data in the packet
- nptr points to the new data in the packet
*/
{
long x, old, new;
x=chksum[0]*256+chksum[1];
x=~x & 0xFFFF;
while (olen)
{
old=optr[0]*256+optr[1]; optr+=2;
x-=old & 0xffff;
if (x<=0) { x--; x&=0xffff; }
olen-=2;
}
while (nlen)
{
new=nptr[0]*256+nptr[1]; nptr+=2;
x+=new & 0xffff;
if (x & 0x10000) { x++; x&=0xffff; }
nlen-=2;
}
x=~x & 0xFFFF;
chksum[0]=x/256; chksum[1]=x & 0xff;
}
endicking 2004-05-09
  • 打赏
  • 举报
回复
关键怎么做呢?
能否提示一点?
echoe 2004-05-09
  • 打赏
  • 举报
回复
可以这个做,而且tcp/ip协议也是这么推荐的。
如果你改变了一个bit,在checksum字段相应改变
Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包, 并尝试显示包的尽可能详细的情况。 你可以把网络包分析工具当成是一种用来测量有什么东西从网线上进出的测量工具,就好像使电工用来测量进入电信的电量的电度表一样。(当然比那个更高级) 过去的此类工具要么是过于昂贵,要么是属于某人私有,或者是二者兼顾。 Wireshark出现以后,这种现状得以改变。 Wireshark可能算得上是今天能使用的最好的开元网络分析软件。 目录: 第 1 章 介绍 4 1.1. 什么是Wireshark 4 1.1.1. 主要应用 4 1.1.2. 特性 4 1.1.3. 捕捉多种网络接口 5 1.1.4. 支持多种其它程序捕捉的文件 5 1.1.5. 支持多格式输出 5 1.1.6. 对多种协议解码提供支持 5 1.1.7. 开源软件 5 1.1.8. Wireshark不能做的事 5 1.2. 系通需求 5 1.2.1. 一般说明 6 1.2.2. Microsoft Windows 6 1.2.3. Unix/Linux 6 1.3. 从哪里可以得到Wireshark 6 1.4. Wiresahrk简史[6] 7 1.5. Wireshark开发维护 7 1.6. 汇报问题和获得帮助 7 1.6.1. 网站 7 1.6.2. 百科全书 7 1.6.3. FAQ 7 1.6.4. 邮件列表 8 1.6.5. 报告问题 8 1.6.6. 在UNIX/Linux平台追踪软件错误 8 1.6.7. 在Windows平台追踪软件错误 9 第 2 章 编译/安装Wireshark 10 2.1. 须知 10 2.2. 获得源 10 2.3. 在UNIX下安装之前 10 2.4. 在UNIX下编译Wireshark 11 2.5. 在UNIX下安装二进制包 12 2.5.1. 在Linux或类似环境下安装RPM包 12 2.5.2. 在Debian环境下安装Deb包 12 2.5.3. 在Gentoo Linux环境下安装Portage 12 2.5.4. 在FreeBSD环境下安装包 12 2.6. 解决UNIX下安装过程中的问题 [10] 12 2.7. 在Windows下编译源 13 2.8. 在Windows下安装Wireshark 13 2.8.1. 安装Wireshark 13 2.8.2. 手动安装WinPcap 14 2.8.3. 更新Wireshark 14 2.8.4. 更新WinPcap 15 2.8.5. 卸载Wireshark 15 2.8.6. 卸载WinPcap 15 第 3 章 用户界面 16 3.1. 须知 16 3.2. 启动Wireshark 16 3.3. 主窗口 16 3.3.1. 主窗口概述 17 3.4. 主菜单 17 3.5. "File"菜单 18 3.6. "Edit"菜单 19 3.7. "View"菜单 20 3.8. "Go"菜单 22 3.9. "Capture"菜单 23 3.10. "Analyze"菜单 24 3.11. "Statistics"菜单 25 3.12. "Help"菜单 27 3.13. "Main"工具栏 27 3.14. "Filter"工具栏 29 3.15. "Pcaket List"面板 29 3.16. "Packet Details"面板 30 3.17. "Packet Byte"面板 30 3.18. 状态栏 31 第 4 章 实时捕捉数据包 32 4.1. 介绍 32 4.2. 准备工作 32 4.3. 开始捕捉 32 4.4. 捕捉接口对话框 32 4.5. 捕捉选项对话框 33 4.5.1. 捕捉桢 34 4.5.2. 捉数据帧为文件。 35 4.5.3. 停止捕捉桢 35 4.5.4. 显示桢选项 35 4.5.5. 名称解析设置 36 4.5.6. 按钮 36 4.6. 捕捉文件格式、模式设置 36 4.7. 链路层包头类型 37 4.8. 捕捉时过滤 37 4.8.1. 自动过滤远程通信 38 4.9. 在捕捉过程中 38 4.9.1. 停止捕捉 39 4.9.2. 重新启动捕捉 39 第 5 章 文件输入/输出及打印 41 5.1. 说明 41 5.2. 打开捕捉文件 41 5.2.1. 打开捕捉文件对话框 41 5.2.2. 输入文件格式 42 5.3. 保存捕捉包 43 5.3.1. "save Capture File As

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧