G_VAR
发表于 2011-03-15 21:47
回复 9# Godbach
哥德巴赫兄,请教你个问题:
我对数据包进行了修改,并在</body>之前加上了一个<table></table>的标签,又重新计算了校验和,但是在浏览页面的时候,网页只显示了一部分,修改了的那个数据包没有收到,不知道是什么原因呢?是校验和不对么?
Godbach
发表于 2011-03-15 22:33
回复 11# G_VAR
你是在页面中插入了一些数据,对吧。
客户端浏览器没看到你修改的地方,那么原始页面是否都能看到
Godbach
发表于 2011-03-15 22:34
改了的那个数据包没有收到,不知道是什么原因呢?是校验和不对么?
具体说一下你为了插入这些数据,就做了哪些工作?
另外,你可以打印调试信息的,客户端也可以抓包的
G_VAR
发表于 2011-03-15 23:52
回复 12# Godbach
只是显示了部分页面,修改数据的那部分的TCP Segment(应该是这个吧?)都没有显示出来,也就是说像现在的页面,只显示了上半部分,下半部分没有显示!
我大概做的工作是这样的:
(1) 抓取数据包
(2)去掉ip头,tcp头,剩下payload
(3)在payload中查找</body>字符串
(4)之后用pskb_expand_head重新分配空间
(5)再把payload中</body>之前的部分copy到重新分配的空间中,之后再加上添加的标签,之后再加上</body>之后的内容
(6)最后重新计算ip校验和,tcp校验和
差不多就是这样!
我刚接触这块,条理不是很清楚,可能说的不好,请见谅啊!
还有一个问题之前忘了说了,web显示部分页面还是我把校验和部分注视掉之后的情况,如果不注释掉计算校验和的部分,系统会直接崩溃!(这是否说明是校验和不对呢?)
如果可以,还请哥德巴赫兄给讲一下实现我这个功能的大概思路应该是什么样的?
小弟十分感谢!!
Godbach
发表于 2011-03-16 10:03
你的思路没有问题。不过可以考虑简化处理。
我大概做的工作是这样的:
(1) 抓取数据包
(2)去掉ip头,tcp头,剩下payload
你这里所谓的去掉,准确的应该是说 获取到吧?
(3)在payload中查找</body>字符串
(4)之后用pskb_expand_head重新分配空间
(5)再把payload中</body>之前的部分copy到重新分配的空间中,之后再加上添加的标签,之后再加上</body>之后的内容
建议先判断一下 原始 skb 的 tailroom,如果 tailroom 的大小超过你要插入的那段数据长度,建议直接修改 tail 指针,移动的长度就是你插入数据的长度。
然后调用将载荷部分按照你的要求调整。
(6)最后重新计算ip校验和,tcp校验和
校验和的计算是必须的。
goter
发表于 2011-03-16 12:50
回复Godbach
哥德巴赫兄,请教你个问题:
我对数据包进行了修改,并在之前加上了一 ...
G_VAR 发表于 2011-03-15 21:47 http://linux.chinaunix.net/bbs/images/common/back.gif
你确定是没收到吗?
没收到那个修改的数据包,tcp是会重传的
G_VAR
发表于 2011-03-16 15:58
回复 16# goter
是的,会一直重传!但是还是没有显示在浏览器中!
G_VAR
发表于 2011-03-16 16:06
回复 15# Godbach
谢谢哥德巴赫兄,我今天进行了稍微的修改,最后的数据包也可以显示在页面上,但是察看显示的网页源码,发现丢失了一部分的源码,我是在</body></html>之前加上了<script .......></script>标签,之后在网页上只显示了<script ....这一点内容,长度大概是</body></html>的长度,之后的部分都没有显示出来!
我看wireshark抓到的包中,我修改的数据包的seq和ack_seq都变了,于是我又在local out位置的hook将该包的seq和ack_seq修改回原来的值,倒是解决了修改的包不显示的问题,数据包不再重传,但是却出现了我上边提到的问题。
这是为什么呢?
Godbach
发表于 2011-03-16 16:30
谢谢哥德巴赫兄,我今天进行了稍微的修改,最后的数据包也可以显示在页面上,但是察看显示的网页源码,发现丢失了一部分的源码,我是在</body></html>之前加上了<script .......></script>标签,之后在网页上只显示了<script ....这一点内容,长度大概是</body></html>的长度,之后的部分都没有显示出来!
抓包可以看到你修改的数据已经在数据包中了吗?
我看wireshark抓到的包中,我修改的数据包的seq和ack_seq都变了,于是我又在local out位置的hook将该包的seq和ack_seq修改回原来的值,倒是解决了修改的包不显示的问题,数据包不再重传,但是却出现了我上边提到的问题。
你的修改 TCP 协议栈是不知道的,如果这个页面不在一个 skb 中的话,客户端收到之后,发出的 ack 包中,ack_seq 是不等于服务器端期望的 ack_seq 的
andyzhuangyy
发表于 2011-03-16 17:39
请问哥德巴赫兄,如果我在LOCAL_IN的hook函数里更改tcp包(http页面)内容的话,抓包是显示不出来的吧
并且现在遇到这样一个问题。
我在原页面的末尾某处
如</body></html>前插入一段字符"1234567890",但是浏览器中只能显示"1234567890</bo"
意思就是传到浏览器的数据长度还是原来的那么长
我在local in的回调函数里这么做的:
1.判断tailroom,从而判断是否使用pskb_expand_head分配更多的连续空间。if tailroom>strlen(str)
则不使用pskb_expand_head。其中str为待插入字符串。
2.使用skb_put设置tail指针,扩展strlen(str)大小的空间。
3. 转字节序重设ip头的tot_len
4.插入待插入数据
5. return NF_ACCEPT
现在问题是,如果我在log里输出从haystack(tcp包头的尾指针)开始的字符串,是可以将全部的页面内容输出的,但是浏览器上却只显示修改前的页面长度的相应长度的页面内容
这是什么原因??
此外,为了避免server端收不到ack的确认信息,在LOCAL_OUT里重构了ack,也就是将原有的ack_seq+=strlen(str),此处在代码中已经转了字节序,已经没有问题。
但是由于浏览器期望的next seq已经改变,所以页面下一个包(是一张图片),就无法传送到浏览器,不知怎样解决。