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

时间:2012-08-03 11:13:11

标签: python header ip scapy

在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

2 个答案:

答案 0 :(得分:5)

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

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

我很惊讶没有方法(我能找到)只返回没有较低层的IP头。

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

答案 1 :(得分:4)

如果有人碰到这个问题,我想你可能能够使用类Packet的remove_payload()函数(由IP继承)。这应该只是留下标题。我是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                                        ....
>>>