詢問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