[英]Scapy: how do I get the full IP packet header?
在 Scapy 中,我想手動將數據包與其相應的 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 標頭。
如果其他人遇到這個問題,我認為您可以使用類 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.