2014-12-02 279 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