Scapy错误的TCP校验和计算

时间:2014-12-02 08:17:48

标签: python tcp scapy

在询问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(),并且我获得了与我相同的价值。

2 个答案:

答案 0 :(得分:0)

1)您是否尝试复制完整的数据包,而不仅仅是其TCP部分:

ack_pkt=ack_pkt.__class__(str(ack_pkt))

2)您是否尝试过following方法,将数据包显式转换为字符串并使用字符串重新创建?

3)如果以上都不起作用,请发布您正在使用的TCP ACK数据包

答案 1 :(得分:0)

我尝试通过跟pythonC (with libpcap)one's compliment of one's compliment sum进行手动校验和重新计算,并且我获得与scapy相同的值来获取上述数据包。所以我想linux-kernel中的校验和计算会以某种方式被修改。

(说一个人错了,而不是说其他​​所有人都错了。:P)