Scapy:我如何获得完整的IP包头?

Ric*_*son 6 python ip header scapy

在Scapy中,我想手动匹配数据包及其相应的ICMP超时消息.

我需要匹配:

  • ICMP数据包的IP-in-ICMP字段
  • IP报头和我的数据包的前8个字节ICMP数据包不是问题:

    icmpPayload = str(icmpPacket [ICMP] .payload)

至于数据包的前8个字节,我只需要做:

str(myPacket[IP].payload)[:8]
Run Code Online (Sandbox Code Playgroud)

我不知道如何获取IP头myPacket.我现在所做的就是用前8个字节替换整个数据包中的有效负载.如果应用于数千个数据包,这种搜索和替换可能需要太长时间,我担心:

 strOfMyPacket = str(myPacket[IP])
 strOfMyPacket.replace(str(myPacket[IP].payload),str(myPacket[IP].payload)[:8],1)
Run Code Online (Sandbox Code Playgroud)

任何更快的方式,让我只做以下几点?

 partOfPayload = str(myPacket[IP].payload)[:8]
 fullHeader = _______
 stringToCompare = fullHeader + partOfPayload
Run Code Online (Sandbox Code Playgroud)

tMC*_*tMC 5

str(myPacket)[:(myPacket[IP].ihl * 4)]
Run Code Online (Sandbox Code Playgroud)

IP标头长度在字段ihl(Internet标头长度)中。它表示为标头使用的32位字的数量。(由于标头的“选项”部分,该变量是可变的)。因此,如果我们将该字段乘以32,然后除以8(或* 4),我们将获得标头填充的字节数,无论是否具有选项。

令我惊讶的是,没有方法(我可以找到)只返回没有低层的IP标头。

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

  • 使用 `print(str(myPacket)[:(myPacket[IP].ihl * 4)])` 后,它打印 `b'\x00\x00\x01\x07@\x00\x00\x0b;;2\x00 '`,您知道如何获取其解码标头吗:`<IP version=4 ihl=5 tos=0x0 len=496 id=9384 flags=DF frag=0 ttl=64 proto=tcp chksum=0x90e4 src=172.23 .21.215 dst=172.23.21.118 选项=[]` (2认同)

Yun*_*mre 5

如果其他人遇到这个问题,我想你也许可以使用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                                        ....
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 有什么办法可以删除标题吗?即:以太网、IPv4 或 TCP (2认同)