7

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

我需要匹配:

  • ICMP数据包的IP-in-ICMP字段
  • IP 标头和我的数据包的前 8 个字节 ICMP 数据包没有问题:

    icmpPayload = str(icmpPacket[ICMP].payload)

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

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

我不知道如何获取myPacket. 我现在要做的就是用前 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
4

2 回答 2

5
str(myPacket)[:(myPacket[IP].ihl * 4)]

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

我很惊讶没有方法(我能找到)在没有较低层的情况下仅返回 IP 标头。

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

于 2012-08-24T14:50:08.770 回答
4

如果其他人遇到这个问题,我认为您可以使用类 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                                        ....
>>> 
于 2015-02-08T07:17:34.493 回答