簡體   English   中英

使用 scapy 從 pcap 文件中提取有效負載中的特定字節

[英]Extract specific bytes in payload from a pcap file using scapy

我正在嘗試從 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'

我已將要提取的字節包含在三顆星內。 但是,如果我打印出每個數據包的字節,我想提取的字節將處於不同的偏移量中。

如果我為每個數據包運行一個 hexdump,如下所示:

hexdump(bytes(pl[12].payload))

我要提取的特定字節總是在相同的位置,但我不知道如何提取它。

如何使用 scapy 從 pcap 中提取特定字節?

按照這里的答案: 從 pcap 文件中獲取有效負載中的特定字節

如果我執行相同的命令,它不會做任何有用的事情:

>>> hexdump(pkts[14][2].load[8])
0000  00 00 00 00 00 00 00 00                          ........
>>>

你想要TTL嗎?

讓我們從高層開始,然后向下移動。

Scapy 正在為您提供構建的數據包。 如果你想要數據包的 TTL,調用屬性:

>>> plist[182].ttl
64

如果要獲取數據包的特定字節,請查看 hexdump:

>>> 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].payload 為您提供數據包的 IP 部分,因此偏移量將有所不同,因為我們不再查看整個數據包。 我們可以使用 '.ttl' 屬性獲得相同的值。 或者,知道地址是 IP 標頭中的第 8 字節:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM