我试图从pcap文件中的每个数据包中提取一个特定字节。所有数据包都是ICMP
在数据部分,有一个字节改变每个数据包。每一个都处于相同的位置。我想提取那个字节
使用scapy:
pkts = rdpcap('test.pcap')
pl = PacketList([p for p in pkts])
bytes(pl[12].payload)
返回以下内容:
b'E\x00\x00T]\xa7\x00\x00***J***\x01!A\xc0\xa88\x01\xc0\xa88o\x08\x004\xe9\xbf2\x00\x00^"\x87\xbe\x00\x0c2\xf4\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'
我已将要提取的字节括在三星中。但是,如果我打印出每个数据包的字节,我要提取的字节将位于不同的偏移量中
如果我为每个数据包运行hextump,如下所示:
hexdump(bytes(pl[12].payload))
我想提取的特定字节总是在相同的位置,但我不知道如何提取它
如何使用scapy从pcap提取特定字节
下面是这个答案:Get specific bytes in payload from a pcap file
如果我执行相同的命令,它不会做任何有用的事情:
>>> hexdump(pkts[14][2].load[8])
0000 00 00 00 00 00 00 00 00 ........
>>>
你想要TTL吗
让我们从高层开始,然后向下移动
Scapy正在给你构造的包。如果需要数据包的TTL,请调用该属性:
如果要获取数据包的特定字节,请查看hextump:
这些是十六进制的,第一个字段0000是偏移量,然后是十六进制的16字节,然后是ascii
事情从0开始,所以第一行的字节地址是0..15。 第二行偏移量为16(16*1)。所以字节地址是16..31。 第三行,偏移量为32(16*2)。所以字节地址是32..47
您突出显示了第2行的第7个字节:
该地址是:
这给了我们:
这样,我们现在可以从原始数据包中获取字节地址22:
请注意,wireshark数据包编号从1开始。python中的数据包将从0开始。在我的示例中,数据包182对应于Wireshark中的数据包183
plist[182]。有效负载提供了数据包的IP部分,因此偏移量会有所不同,因为我们不再查看整个数据包。我们可以使用“.ttl”属性获得相同的值。或者,知道地址是IP报头中的字节8:
相关问题 更多 >
编程相关推荐