使用scapy从pcap文件中提取有效负载中的特定字节

2024-06-28 19:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从pcap文件中的每个数据包中提取一个特定字节。所有数据包都是ICMP

在数据部分,有一个字节改变每个数据包。每一个都处于相同的位置。我想提取那个字节

enter image description here

使用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                          ........
>>>

Tags: 文件in字节bytespcap数据包hexdumpscapy
1条回答
网友
1楼 · 发布于 2024-06-28 19:32:44

你想要TTL吗

让我们从高层开始,然后向下移动

Scapy正在给你构造的包。如果需要数据包的TTL,请调用该属性:

>>> plist[182].ttl
64

如果要获取数据包的特定字节,请查看hextump:

>>> hexdump(plist[182])
0000  AA BB CC 66 42 DE AA BB CC 3F 52 A3 08 00 45 00  .a.lM..M.AK...E.
0010  00 5B 58 B9 40 00 40 06 64 96 C0 A8 01 28 AC D9  .[X.@.@.d....(..
...

这些是十六进制的,第一个字段0000是偏移量,然后是十六进制的16字节,然后是ascii

Offset  Bytes                                            ASCII
======  ===============================================  ================
0000    AA BB CC 66 42 DE AA BB CC 3F 52 A3 08 00 45 00  .a.lM..M.AK...E.

事情从0开始,所以第一行的字节地址是0..15。 第二行偏移量为16(16*1)。所以字节地址是16..31。 第三行,偏移量为32(16*2)。所以字节地址是32..47

您突出显示了第2行的第7个字节:

Offset Bytes                                            ASCII
       0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
====== ===============================================  ================
0010   00 5B 58 B9 40 00 40 06 64 96 C0 A8 01 28 AC D9  .[X.@.@.d....(..

该地址是:

offset + byte_address.
offset = 16 * 1
byte_address = 6

这给了我们:

16 + 6 = 22

这样,我们现在可以从原始数据包中获取字节地址22:

>>> b = raw(plist[182])
>>> b[22]
64

请注意,wireshark数据包编号从1开始。python中的数据包将从0开始。在我的示例中,数据包182对应于Wireshark中的数据包183

plist[182]。有效负载提供了数据包的IP部分,因此偏移量会有所不同,因为我们不再查看整个数据包。我们可以使用“.ttl”属性获得相同的值。或者,知道地址是IP报头中的字节8:

>>> plist[182].payload.ttl
64
>>> raw(plist[182].payload)[8]
64

相关问题 更多 >