询问this后,我只是想做一个简单的测试。我使用tcpdump
捕获了流量。过滤掉Wireshark
中的TCP ACK数据包,并将过滤后的数据包导出到sample.pcap
。错误的TCP校验和计算Scapy
现在,这是相当多我对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()
和我得到相同的值,因为我上面得到。
'1)'起初,我只是在做同样的。我有错误的价值。所以出于好奇,我尝试像上面提到的那样。 '2)'是的。这也只给出相同的价值。 '3)'我马上更新信息包。这意味着让我尝试手动校验和计算。 – RatDon 2014-12-03 04:20:05
用数据包信息更新了问题。 – RatDon 2014-12-03 08:23:21