2011-05-10 36 views

回答

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)] 
>>> 
+3

謝謝。 我發現另一個選項 - 將數據包轉換爲字符串,並使用該字符串重新創建它。 – 2011-05-24 18:55:06

+1

@Dima,感謝您的建議。我想避免'show2()',因爲所有的輸出都是不必要的。也許應該有一個'recalc'數據包功能。 – 2011-07-21 12:58:17

+0

@Mr。 Shickadance,通過重新分配'stdout',你可以輕鬆地靜默一下......即stdout,null = sys.stdout,open('/ dev/null','w'); sys.stdout = null'。當你完成重新分配'sys.stdout = stdout' – 2011-07-21 17:40:02

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].chksumdel pkt[UDP].chksum等)如前面的答案所示。

此功能應該更快,並保持沉默。 (可能還需要修改其他內容;我一起對此代碼進行了黑名單操作,並且只進行了測試,以確保它在正確的校驗和下保持沉默。)