免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: platinum
打印 上一主题 下一主题

应如何正确计算 TCP 序号? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-10-31 12:27 |只看该作者
原帖由 Au_Hank 于 2008-10-31 12:17 发表
比如说你在网上给白金转帐100,白金通过这个手段把金额改成10000

对对!类似这个意思!
不仅如此,我花费 10000 的时候改成 100!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
42 [报告]
发表于 2008-10-31 13:28 |只看该作者
原帖由 platinum 于 2008-10-31 12:27 发表

对对!类似这个意思!
不仅如此,我花费 10000 的时候改成 100!


呵呵,这个改动有意思。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
43 [报告]
发表于 2008-11-02 11:28 |只看该作者
原帖由 platinum 于 2008-10-30 11:25 发表
有这样一个需求:
一个桥设备,修改某个 TCP 连接后的七层 request,修改其内容,重新计算校验和,继续把数据包放回系统透传

遇到一个问题:
因为修改了 request,所以 payload 长度产生了变化(可能多、可 ...

如果仅仅是修改原数据包的内容,且不超过MSS,只需要更改ip校验、tcp校验、以及你要修改的数据,NAT技术就是这么做的,只是NAT不修改数据,修改的源IP、port
至于什么重传之类的,只要你能识别出被修改的数据包就行了。这种修改相当于3层的修改,与你的会话是无关的。
如果超过MSS,可以做分片处理。如果修改seq,应用层上处理简单。

论坛徽章:
0
44 [报告]
发表于 2008-11-03 00:25 |只看该作者
这个问题肯定有解,  问问网络尖兵和信风的技术人员 哈哈,唯一的区别是他们的设备是冒充双方的IP地址后,用来中断双方连接的。

论坛徽章:
0
45 [报告]
发表于 2008-11-03 11:38 |只看该作者
原帖由 zmoon 于 2008-11-3 00:25 发表
这个问题肯定有解,  问问网络尖兵和信风的技术人员 哈哈,唯一的区别是他们的设备是冒充双方的IP地址后,用来中断双方连接的。

冒充某一个数据包很简单,只要截获并推测 seq 号,伪造 RST 包就行了,和这个截然不同

论坛徽章:
0
46 [报告]
发表于 2008-11-03 17:45 |只看该作者
做过类似的。如果只是象你说的这样,那比较好解决。
就是指插入的数据很少,可能就几个字符,所以不需要重传,不跨越包界限。可能就插入或删除一次。但是一般都是想完全劫持TCP的,所以重组重传都是需要的。

TCP连接跟踪,这个你一定已经做了。 记录offset和插入的开始点。将offset加到syn 上,减到反向的ack上。

1、在系统中维护这个 TCP 连接的序号,重新计算,但应该怎么计算?
      newsyn =    htonl (ntohl(oldsyn) + offset)
       然后tck checksum还需要重算。
    注意最后的fin-ack也需要更改。要不可能长时间这个连接在来回发fin .

2、不清楚是否滑动窗口也要重新计算?
        不需要改变。

3、如果 TCP 连接正常,这个规律还相对简单,如果遇到丢包、重传、乱序、复制包怎么办?如何判断?
      如果你根据单个包就可以分辨出要改哪里,这些就可以不管,你改过的那个包丢了,你也不需要重传,等重传包来了以后,你再改一次就是了。
如果不能单个包确定插入点和完成插入,就麻烦了一点。就需要自己TCP重组了。
如果要插入大段数据,比如几十K,当然需要自己重传,需要有发送队列,还需要拥塞控制了。


4、如果改变了 seq,那么 ack_seq 肯定也要改的,win 呢?是否也需要一起修改?
          这边的ack不需要改,要是你插入了两个字节,回来的ack就要减去两个字节了。否则就乱套了。win还是不需要更改。

5、上面的解决思路是否正确?是否有什么好方法可以解决这个问题呢?
        据我所知,没有更好的方法了。本来squid有种透明代理的,好像你说不适合你用。

   libnids中TCP重组的部分, honeyd(honeyd.c)中的模拟TCP连接部分,可以做为参考。

论坛徽章:
0
47 [报告]
发表于 2008-11-03 20:50 |只看该作者
我所要修改的数据包不会超过 MSS,不会涉及到分片,唯一担心的就是乱序、重传、丢包的情况
lstopcat 兄的答复对我的帮助很大,我好好研究一下,谢谢你!

论坛徽章:
0
48 [报告]
发表于 2008-11-04 22:27 |只看该作者

回复 #1 platinum 的帖子

楼主有兴趣的话翻翻RFC1631、3022吧。

论坛徽章:
0
49 [报告]
发表于 2008-11-05 11:42 |只看该作者
好的多谢,我看一下!

论坛徽章:
0
50 [报告]
发表于 2008-11-08 21:28 |只看该作者

回复 #1 platinum 的帖子

你可以参考一下我维护的那个drcom for linux:
http://sourceforge.net/projects/drcom-client
下载drcom-1.4.8.tar.gz即可。

这个臭名昭著的drcom是一个ISP登录系统。
用户登录后,发出的每个TCP连接,都需要在三次握手后,插入一个16字节的验证信息。

源代码中的内核模块(kmod目录下的drcom.c),就是处理这个插入16字节验证信息的。
我写这个模块时,基本上就是借鉴内核tcp conntrack和nat的东西。
基本上就是一个简单的conntrack。

主要的工作就是看当前接收到的包是在我插入的信息的前面还是后面,相应地修改seq和ack,
当然,还包括SACK的修改。如果需要,则在要求的位置插入16字节信息。

[ 本帖最后由 wheelz 于 2008-11-8 22:23 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP