2014-12-02 281 views
1

询问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()和我得到相同的值,因为我上面得到。

回答

0

工作的TCP ACK数据包我都尝试用pythonC (with libpcap)手动重新计算校验和按照one's compliment of one's compliment sum和我得到相同的值scapy获取提到的数据包。所以我猜想linux-kernel中的校验和计算会以某种方式被修改。

(最好是说一个人是错的,而不是说所有其它3是错误的:P)

0

1)你有没有尝试复制一个完整的数据包,而不仅仅是它的TCP部分:

ack_pkt=ack_pkt.__class__(str(ack_pkt)) 

2)你有没有尝试following方法,包显式转换为字符串,并使用该字符串重新创建?

3)如果以上都没有效果的,请发表你与

+0

'1)'起初,我只是在做同样的。我有错误的价值。所以出于好奇,我尝试像上面提到的那样。 '2)'是的。这也只给出相同的价值。 '3)'我马上更新信息包。这意味着让我尝试手动校验和计算。 – RatDon 2014-12-03 04:20:05

+0

用数据包信息更新了问题。 – RatDon 2014-12-03 08:23:21