在询问this之后,我只想做一个简单的测试。我使用tcpdump
捕获了流量。在Wireshark
中过滤掉TCP ACK数据包,并将过滤后的数据包导出到sample.pcap
。
现在这几乎是我的TCP校验和重新计算的代码:
from scapy.all import *
ack_pkt = sniff(offline="sample.pcap", count=1)[0]
print "Original:\t", ack_pkt[TCP].chksum
del ack_pkt[TCP].chksum
print "Deleted:\t", ack_pkt[TCP].chksum
ack_pkt[TCP]=ack_pkt[TCP].__class__(str(ack_pkt[TCP]))
print "Recalculated:\t", ack_pkt[TCP].chksum
我得到的输出是:
WARNING: No route found for IPv6 destination :: (no default route?)
Original: 30805
Deleted: None
Recalculated: 55452
校验和重新计算过程是否正确或是否有其他重新计算校验和的内容?由于scapy被广泛使用了很长时间,我猜,我的校验和重新计算有问题。
更新了数据包信息:(为了获得更好的视图,未显示以太网标头。)
以十六进制字符串查看数据包:
from binascii import hexlify as hex2
ack_pkt = sniff(offline="sample.pcap", count=1)[0]
print ack_pkt.chksum, ack_pkt[TCP].chksum
print hex2(str(ack_pkt[IP]))
del ack_pkt.chksum
del ack_pkt[TCP].chksum
print ack_pkt.chksum, ack_pkt[TCP].chksum
print hex2(str(ack_pkt[IP]))
ack_pkt=ack_pkt.__class__(str(ack_pkt))
print ack_pkt.chksum, ack_pkt[TCP].chksum
print hex2(str(ack_pkt[IP]))
ack_pkt[TCP].chksum=0
print hex2(str(ack_pkt[IP]))
我得到的输出是:
26317 30805
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*7855*00000101080a47e8a8af0b323857
None None
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*d89c*00000101080a47e8a8af0b323857
26317 55452
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*d89c*00000101080a47e8a8af0b323857
450000345bc840004006*66cd*0e8b864067297c3a0016a2b9f11ddc3fe61e9a8d801000f7*0000*00000101080a47e8a8af0b323857
(*仅用于标记校验和字节。)
难道不奇怪吗?删除校验和后,当我放置ack_pkt.show()
时,我看到两个校验和字段都是None
。但是在转换为十六进制字符串时,是否重新计算了?
ack_pkt[TCP].chksum=0
对此,重新计算的校验和仅为0
。
注意:
我已尝试使用ack_pkt[TCP].show2()
,并且我获得了与我相同的价值。
答案 0 :(得分:0)
1)您是否尝试复制完整的数据包,而不仅仅是其TCP部分:
ack_pkt=ack_pkt.__class__(str(ack_pkt))
2)您是否尝试过following方法,将数据包显式转换为字符串并使用字符串重新创建?
3)如果以上都不起作用,请发布您正在使用的TCP ACK数据包
答案 1 :(得分:0)
我尝试通过跟python
跟C (with libpcap)
和one's compliment of one's compliment sum
进行手动校验和重新计算,并且我获得与scapy
相同的值来获取上述数据包。所以我想linux-kernel中的校验和计算会以某种方式被修改。
(说一个人错了,而不是说其他所有人都错了。:P)