在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
答案 0 :(得分:5)
str(myPacket)[:(myPacket[IP].ihl * 4)]
IP标头长度位于字段ihl
(Internet标头长度)中。它表示为标头使用的32位字的数量。 (由于标题的'options'部分,它是可变的)。因此,如果我们将该字段乘以32然后除以8(或* 4),我们将获得标头填充的字节数,无论是否有选项。
我很惊讶没有方法(我能找到)只返回没有较低层的IP头。
答案 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 ....
>>>