Ric*_*son 6 python ip header scapy
在Scapy中,我想手动匹配数据包及其相应的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)
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
如果其他人遇到这个问题,我想你也许可以使用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)