16
A
回答
12
在創建數據包後,您需要從數據包中刪除.chksum
值;然後致電.show2()
>>> from scapy.layers.inet import IP
>>> from scapy.layers.inet import ICMP
>>> from scapy.layers.inet import TCP
>>> target = "10.9.8.7"
>>> ttl = 64
>>> id = 32711
>>> sport = 2927
>>> dport = 80
>>> pak = IP(dst=target, src = "100.99.98.97", ttl=ttl, flags="DF", id=id, len=1200, chksum = 0)/TCP(flags="S", sport=sport, dport=int(dport), options=[('Timestamp',(0,0))], chksum = 0)
>>> del pak[IP].chksum
>>> del pak[TCP].chksum
>>> pak.show2()
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 1200
id = 32711
flags = DF
frag = 0L
ttl = 64
proto = tcp
chksum = 0x9afd
src = 100.99.98.97
dst = 10.9.8.7
\options \
###[ TCP ]###
sport = 2927
dport = www
seq = 0
ack = 0
dataofs = 8L
reserved = 0L
flags = S
window = 8192
chksum = 0x2c0e
urgptr = 0
options = [('Timestamp', (0, 0)), ('EOL', None)]
>>>
21
我也試圖避免show2(),因爲它打印數據包。 我在源中找到一個更好的解決方案:
del packet.chksum
packet = packet.__class__(str(packet))
該代碼再生與無任何打印校驗正確的數據包,實際上是什麼show2()在打印之前在後臺運行。然後
+ def checksum_silent(self):
+ """
+ Internal method that recalcs checksum without the annoying prints
+ **AFTER old checksums are deleted.**
+ """
+
+ for f in self.fields_desc:
+ if isinstance(f, ConditionalField) and not f._evalcond(self):
+ continue
+ fvalue = self.getfieldval(f.name)
+ if isinstance(fvalue, Packet) or (f.islist and f.holds_packets and type(fvalue) is list):
+ fvalue_gen = SetGen(fvalue,_iterpacket=0)
+ for fvalue in fvalue_gen:
+ fvalue.checksum_silent()
+ if self.payload:
+ self.payload.checksum_silent()
而不是調用pkt.show2()
,只需調用這個函數 pkt.checksum_silent()
:
0
加入這個補丁Scapy的/ packet.py。 (記得先做del pkt[IP].chksum
和del pkt[UDP].chksum
等)如前面的答案所示。
此功能應該更快,並保持沉默。 (可能還需要修改其他內容;我一起對此代碼進行了黑名單操作,並且只進行了測試,以確保它在正確的校驗和下保持沉默。)
相關問題
- 1. 如何計算校驗和
- 2. 如何使用Python計算TCP數據包校驗和?
- 3. 校驗和計算
- 4. 如何計算TCP校驗
- 5. 如何計算二進制校驗和?
- 6. 如何計算下面的校驗和?
- 7. OVS:如何計算ICMPV6校驗和?
- 8. 如何計算CRC32校驗和?
- 9. 當我們使用tcpdump捕獲我們發送的數據包時,TCP的校驗和是如何計算的
- 10. 計算校驗
- 11. exFAT校驗和的計算
- 12. 計算校驗和android
- 13. UDP校驗和計算
- 14. NMEA校驗和計算
- 15. 計算UDP層校驗和
- 16. 計算校驗和相似
- 17. 如何計算udp數據包發送和接收的時間
- 18. IP校驗和計算不正確
- 19. 計算點數的校驗和
- 20. 什麼校驗和技術會讓我從它的部件的校驗和中計算整個校驗和?
- 21. libtrace的函數來計算包校驗和
- 22. ICMP頭和IP頭校驗和計算
- 23. 如何計算結構數組的CRC(校驗和)?
- 24. 如何計算校驗和的合理位數?
- 25. 如何計算Arduino上的256模數校驗和
- 26. 計算的tcp校驗和與原始的tcp校驗和不匹配
- 27. 在adler校驗和計算中是否應包含zlib Type0標題數據?
- 28. 讀取MP3音頻數據或計算其校驗和
- 29. 從NSData計算iPhone上的校驗和
- 30. 在Python中計算IP校驗和
謝謝。 我發現另一個選項 - 將數據包轉換爲字符串,並使用該字符串重新創建它。 – 2011-05-24 18:55:06
@Dima,感謝您的建議。我想避免'show2()',因爲所有的輸出都是不必要的。也許應該有一個'recalc'數據包功能。 – 2011-07-21 12:58:17
@Mr。 Shickadance,通過重新分配'stdout',你可以輕鬆地靜默一下......即stdout,null = sys.stdout,open('/ dev/null','w'); sys.stdout = null'。當你完成重新分配'sys.stdout = stdout' – 2011-07-21 17:40:02