【发布时间】:2015-01-30 10:09:21
【问题描述】:
问了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(),并且得到的值与上面的值相同。
【问题讨论】: