该怎么从netfilter勾出来的报文里读取数据?-灵析社区

梦想缔造狮

这个包打印的没啥问题,应该是你打错包了。 TCP协议是有三次握手的,有syn、ack、fin、rst这些控制报文,所以你判断源端口是不是12345,并不能说明这个包一定就是你想要的带着ABC数据的报文。通过打印结果来看,这就是一个ACK的空包。 1. 第一个字节是字符E,16进制是0x45,说明skb->data指向的是一个IPv4头,IP头部长度为20字节。这个是符合预期,没什么问题。 2. 然后看IP头的第三、四个字节,这个字段是整个IP包的长度,字符';'的16进制是0x3B,换算称10进制就是59,也就是说明你这个包的整长度就是59,ip头已经占了20了,留给tcp的还有39个字节了。 3. 5、6、7、8这四个字节是IP报文的ID、Flag、Fragment字段,跳过。 4. 第九个字节是TTL,字符‘@’的16进制是0X40,是LINUX内核默认的64,说明你这个包还没经过Forwad阶段,所以猜测你这个hook应该是挂的PRE_ROUTING。 5. 第10个字节是协议号,6代表TCP,也符合预期。 6. 跳过2个字节的校验和,剩下8个字节是源和目的IP地址,127.0.0.1到127.0.0.1,说明你这个包是从lo口发给lo口的测试包。 7. 接下来是tcp头,21、22字节是源端口,字符0和字符9换算成10进制就是12345,符合预期。 8. 23、24字节是目的端口,换算下来也符合预期。 9. 接下来跳过8个字节的Ack和Seq,第33、34个字节是0X80和0X18,8表示tcp数据的偏移,4字节为单位,说明这个包的tcp头长度是32。0X18是TCP的Flag,说明这个包打着ack和psh的标记。 10. 从52字节开始,全是0,说明这是个空包。 综上,打印没啥问题,应该是打印错包了。另外你计算end的那行我猜你的本意应该是找到报文结束吧?代码写错了,head和tail这俩是指针,指针相加不是代表报文结束,所以你这个printk打印了后面的一堆的0, 如果不考虑非线性数据: for(c = skb->data, c tail; c++) { printk(...); }

阅读量:1

点赞量:0

问AI