当我使用原始套接字伪造IP数据包时,似乎我可以为其总长度设置任意值,而不考虑IP数据包的真实大小。
然而,当我使用Wireshark来捕获数据包时,我发现总长度已被更正为真实大小。这让我很困惑。
有人可以解释这个问题吗?我将非常感谢你的帮助。
感谢。
答案 0 :(得分:0)
当发送大于其实际大小的数据包时,有效负载中的附加数据是一大块零。理论上,在使用Wireshark(或tcpdump)检查它时,您应该在捕获的此类数据包上看到什么。例如:
IP 192.168.0.3.17664 > 178.60.128.48.1: tcp 32
0x0000: 4500 0064 f0d0 4000 4006 56ab c0a8 0003 E..d..@.@.V.....
0x0010: b23c 8030 4500 0001 0000 0000 ff06 dbe4 .<.0E...........
0x0020: c0a8 0003 b23c 8030 04d2 0050 0000 0000 .....<.0...P....
0x0030: 0000 0000 5002 16d0 b3c4 0000 4142 4344 ....P.......ABCD
0x0040: 4546 4748 494a 4b4c 4d4e 4f50 5152 5354 EFGHIJKLMNOPQRST
0x0050: 5556 5758 595a 0000 0000 0000 0000 0000 UVWXYZ..........
0x0060: 0000 0000 ....
这是google.com的TCP数据包(178.60.128.48)。有效载荷是&#34; ABC ... XYZ&#34;,但IP total_length
已被手动增加。结果是有效负载中的填充为零,直到完成数据包的总长度。
那就是说,我的赌注是问题出在sendto
系统调用中。这是实际在套接字上发送数据包的调用。但是这个调用还设置了数据包的total_length
。
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
我怀疑您已经调整了IPv4标头中的数据包total_length
字段,但len
调用上的sendto
参数尚未修改,因此数据包&# 39;发送时,总长度会被覆盖到原来的大小。
这是我的怀疑,但如果不检查代码就很难说清楚。