2009-12-14 64 views
1

我使用pylibnet來構造和發送UDP數據包。我用這種方式構造的UDP數據包似乎都有無效的校驗和。例如:libnet創建帶有無效校驗和的UDP數據包

# python 
Python 2.4.3 (#1, Sep 3 2009, 15:37:12) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
>>> import libnet 
>>> from libnet.constants import * 
>>> 
>>> net = libnet.context(RAW4, 'venet0:0') 
>>> ip = net.name2addr4('www.stackoverflow.com', RESOLVE) 
>>> data = 'This is my payload.' 
>>> udptag = net.build_udp(sp=54321, dp=54321, payload=data) 
>>> packetlen = IPV4_H + UDP_H + len(data) 
>>> iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip) 
>>> 
>>> net.write() 

捕獲上述數據包發送主機上揭示了一個無效的校驗:

# tcpdump -i venet0:0 -n -v -v port 54321 
tcpdump: WARNING: arptype 65535 not supported by libpcap - falling back to cooked socket 
tcpdump: listening on venet0:0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes 
08:16:10.303719 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: UDP (17), length: 47) 192.168.55.10.54321 > 69.59.196.211.54321: [bad udp cksum 50c3!] UDP, length 0 

我錯了在這裏做什麼?

回答

3

這無關tcpdump的錯誤或校驗和卸載。 Libnet也在用戶模式下計算校驗和(FYI)。這個問題與你沒有爲UDP頭指定長度有關。這不是在pylibnet或libnet中自動計算的,所以你必須暫時指定它。以下是您的代碼的更正版本。我會將補丁應用到pylibnet以自動檢測rc6中的標題長度。請繼續關注http://sourceforge.net/projects/pylibnet以獲取更新。我將推出修復此問題的新版本。順便說一下,如果您有錯誤或功能請求,請通過sourceforge的pylibnet頁面隨時與我聯繫。我喜歡用我的軟件開發商聽到:)


import libnet 
from libnet.constants import * 

net = libnet.context(RAW4, 'venet0:0') 
ip = net.name2addr4('www.stackoverflow.com', RESOLVE) 
data = 'This is my payload.' 
udptag = net.build_udp(len=UDP_H+len(data), sp=54321, dp=54321, payload=data) 
packetlen = IPV4_H + UDP_H + len(data) 
iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip) 

net.write() 
1

計算校驗和的工作通常不在用戶空間庫中執行,而是在設備驅動程序或硬件中執行。我相信你會看到「校驗和卸載」的結果,物理設備會計算出站數據包的校驗和,從而節省主機上的CPU週期。許多(如果不是全部的話)現代以太網適配器都這樣做,並且驅動程序不計算校驗和。由於tcpdump正在捕獲驅動程序中的數據包,因此在它們到達物理設備之前,它只會在校驗和字段(可能是緩衝區中剩下的內容)中發生垃圾並抱怨。

在2005年至2008年的時間段內,Wireshark報告了幾個「bug」,Wireshark現在有一個選項可以禁用卸載情況下的校驗和驗證(Wireshark,它只是tcpdump或其Windoze的GUI封裝) 。

http://wiki.wireshark.org/TCP_Checksum_Verification

在任何情況下,我不希望pylibnet(或的libnet)來負責校驗。

參見http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html#id4744523

+0

謝謝。我剛剛通過在接收主機上捕獲這些數據包進行了調查。校驗和在接收主機上也是不好的(並且在發送主機上的捕獲中觀察到相同的值)。所以它看起來不像校驗和卸載是這裏的答案。 – Mox 2009-12-15 19:28:14

+0

如果接收主機實現了標準協議棧,或者兩臺主機之間至少有一臺路由器,則數據包永遠不會在接收主機上可見。其他事情正在發生。 – 2009-12-15 22:40:53

1

我已經更新到pylibnet包括自動大小確定爲最頭的長度字段。這樣,如果您忘記指定任何需要它的標題頭的長度,它將嘗試自動確定它。保存你頭痛的搞清楚爲什麼你的校驗不好;)

+0

太好了。謝謝您的幫助! – Mox 2010-01-22 13:33:59