晴有林风
发表于 2011-03-31 09:29
Anzyfly
发表于 2011-03-31 16:45
iptables中的各个目标模块就可以修改数据包中相关的部分,如MARK, DSCP等等,看看就明白了。{:2_172:}
dspecialtwo
发表于 2012-02-05 12:04
請問G_VAR 大大
你主要是在PAYLOAD的前面加了一些數據
Ex:
在</body>之前加上了一個<table></table>的標籤
然後大概流程如下
(1) 抓取數據包
(2)去掉ip頭,tcp頭,剩下payload
(3)在payload中查找</body>字符串
(4)之後用pskb_expand_head重新分配空間
我最近也是要做類似的東西 不過是把PAYLOAD中間的資料刪掉 因為這兩天才剛碰到這些東西 所以還不是很清楚SKB的使用方式
所以
1.我應該不用作pskb_expand_head重新分配空間 ?
2.
假設我的PAYLOAD是 | A | B |C|
我要把B拿掉 最後組成 | A | C |
這樣的話在SKB 要怎麼完成呢?
1.重新複製一包SKB?
2.就原本的SKB 去做修改?
a.使用memove 把C移到B 然後修改skb->tail ?
因為這兩天才剛碰到這些東西 所以還不是很清楚SKB的使用方式
問的問題可能很淺 或是 想法有錯 還請多多指教XD
Godbach
发表于 2014-09-29 18:22
回复 20# andyzhuangyy
请问哥德巴赫兄,如果我在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包头的尾指针)开始的字符串,是可以将全部的页面内容输出的,但是浏览器上却只显示修改前的页面长度的相应长度的页面内容
这是什么原因??
IP 头和 TCP 头部的 checksum 是否都重新计算了?
浏览器段抓包看 response 包含它的长度和你修改的是否一致。按理说,修改了 HTTP response body部分,HTTP header 中包含 length 字段也需要修改的。如果用的是 Content-Length,那么这个也肯定要改的。
此外,为了避免server端收不到ack的确认信息,在LOCAL_OUT里重构了ack,也就是将原有的ack_seq+=strlen(str),此处在代码中已经转了字节序,已经没有问题。
但是由于浏览器期望的next seq已经改变,所以页面下一个包(是一张图片),就无法传送到浏览器,不知怎样解决。
浏览器其实管不了那么底层的 next seq,这个是 TCP 协议栈维护的。至于你说的下一个包,是不是仍然是在同一个 TCP 连接上。如果是的话,你直线扩展了长度之后,要一直负责维护 seq 的处理。
soso8531337
发表于 2014-10-08 15:35
回复 26# Godbach
如果HTTP响应大于1500被分片了该怎么处理呢?
幻城烟雨
发表于 2014-10-12 18:09
我也是一个学生,最近也是做这个东西,也是要修改数据包的内容,修改网页上的数据。
我现在可以获取到数据包,但是用printk输出的时候出现一大串\xfffffffe\xffffffacs3。
我不知道这是什么,现在我想做的就是字符匹配然后替换。
希望楼主和版主给予提示。如果可以的话,楼主能不能把当时项目的一部分代码贴一下。感恩不尽
呆萌小宅
发表于 2015-05-09 14:18
楼主你好,我也在做跟你一样的事情,不知道数据包中的网页代码你是这么找到的,能提供下你的代码么?谢谢了,我邮箱:1101923161@qq.com 谢谢了!!
royzjh
发表于 2015-09-09 17:06