簡體   English   中英

Scapy:如何獲取完整的 IP 數據包標頭?

[英]Scapy: how do I get the full IP packet header?

在 Scapy 中,我想手動將數據包與其相應的 ICMP 超時消息匹配。

我需要匹配:

  • ICMP數據包的IP-in-ICMP字段
  • IP 標頭和我的數據包的前 8 個字節 ICMP 數據包沒有問題:

    icmpPayload = str(icmpPacket[ICMP].payload)

至於數據包的前 8 個字節,我只需要這樣做:

str(myPacket[IP].payload)[:8]

我不知道如何獲取myPacket的 IP 標頭。 我現在要做的就是用前 8 個字節替換整個數據包中的有效負載。 這種搜索和替換,如果應用於數千個數據包,恐怕會花費太長時間:

 strOfMyPacket = str(myPacket[IP])
 strOfMyPacket.replace(str(myPacket[IP].payload),str(myPacket[IP].payload)[:8],1)

任何更快的方法可以讓我簡單地執行以下操作?

 partOfPayload = str(myPacket[IP].payload)[:8]
 fullHeader = _______
 stringToCompare = fullHeader + partOfPayload
str(myPacket)[:(myPacket[IP].ihl * 4)]

IP 標頭長度位於ihl (Internet 標頭長度)字段中。 它表示為標頭使用的 32 位字數。 (由於標題的“選項”部分,它是可變的)。 因此,如果我們將該字段乘以 32,然后除以 8(或 * 4),我們將得到報頭填充的字節數,無論是否有選項。

我很驚訝沒有方法(我能找到)在沒有較低層的情況下僅返回 IP 標頭。

http://en.wikipedia.org/wiki/IPv4_header#Header

如果其他人遇到這個問題,我認為您可以使用類 Packet(由 IP 繼承)的 remove_payload() 函數。 這應該只留下標題。 我是 scapy 的新手,但是當我在解釋器上嘗試它時,它看起來很有效。

>>> ip = IP(dst='10.0.0.1', src='10.0.0.14', ttl=255)/ICMP()
>>> hexdump(ip)
0000   45 00 00 1C 00 01 00 00  FF 01 A7 D1 0A 00 00 0E   E...............
0010   0A 00 00 01 **08 00 F7 FF  00 00 00 00**               ............
>>> ip.remove_payload()
>>> hexdump(ip)
0000   45 00 00 14 00 01 00 00  FF 00 A7 DA 0A 00 00 0E   E...............
0010   0A 00 00 01                                        ....
>>> 

經過 :

hex_string = linehexdump(paket,onlyhex=1,dump=True)
tokens = hex_string.split(' ')
hex  = ''.join(tokens[20:24])

,我們可以獲取十六進制字符串並手動解析它。 就我而言,我已將 4 個字節的數據修補到交換機上的選項字段中。 我知道它在字節 20 到 24 中。解析后我們可以得到值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM