我正在尝试从各种 CTF 事件中读取 pcap 文件。
理想情况下,我想要一些可以分解信息的东西,例如 wireshark,但只要能够读取时间戳并将数据包作为某种类型的字节串返回,我会很受欢迎。
问题是几乎没有或没有对所有常用库的 python 3 支持:dpkt、pylibpcap、pcapy 等。
有人知道可以与 python 3 一起使用的 pcap 库吗?
最佳答案
据我所知,至少有 2 个包似乎适用于 Python 3:pure-pcapfile
和 dpkt
:
pure-pcapfile
使用pip
很容易安装在 python 3 中。它非常易于使用,但仍然仅限于解码Ethernet 和IP 数据。剩下的就交给你了。但它开箱即用。dpkt
开箱即用 无法正常工作,之前需要一些操作。他们正在将其移植到 Python 3,并计划为 2.0 版提供 Python 2 和 3 兼容版本。不幸的是,它还没有。但是,它比pure-pcapfile
更完整并且可以解码许多协议(protocol)。如果您的数据包嵌入了多层协议(protocol),它会自动为您解码。唯一的问题是您需要在这里和那里进行一些更正才能使其正常工作(在撰写此评论时)。
纯pcap文件
到目前为止,我发现唯一适用于 Python 3 的是 pcapfile。您可以在 https://pypi.python.org/pypi/pypcapfile/ 找到它或通过执行 pip3 install pypcapfile
安装它。
只有基本功能,但对我来说效果很好,并且最近更新了(在撰写此消息时):
from pcapfile import savefile
file = open('mypcapfile.pcp' , 'rb')
pcapfile = savefile.load_savefile(file,verbose=True)
如果一切顺利,您应该会看到如下内容:
[+] attempting to load mypcapfile.pcap
[+] found valid header
[+] loaded 1234 packets
[+] finished loading savefile.
现在说几句。我正在使用 Python 3.4.3。并且执行 import pcapfile
不会从中导入任何东西(我仍然是 Python 的初学者),而是从包中导入唯一的基本信息和函数。接下来,您必须通过将 'rb'
作为模式传递给 open()
函数,以读取二进制模式显式打开文件。在文档中,他们没有明确说明。
其余的就像在文档中一样:
packet = pcapfile.packets[12]
访问数据包编号 12(第 13 个数据包,第一个为 0)。你有基本的功能,比如
packet.timestamp
获取时间戳或
packet.raw()
获取原始数据。
该文档提到了对某些标准格式(如以太网 和IP)进行数据包解码的函数。
dpkt
dpkt
不适用于 Python 3,因此您需要执行以下操作,假设您可以访问命令行。该代码可在 https://github.com/kbandla/dpkt.git 上找到并且您必须先下载它:
git clone https://github.com/kbandla/dpkt.git
cd dpkt
git checkout --track origin/migrate_py3
git pull
这 4 个命令执行以下操作:
- 从其在 github 上的 git 存储库克隆(下载)代码
- 进入名为
dpkt
的新创建目录 - 切换到包含 Python 3 代码的分支名称
migrate_py3
。从这个分支的名称可以看出,它仍处于试验阶段。到目前为止它对我有用。 - (以防万一)再次下载代码
然后将名为 dpkt
的目录复制到您的项目中或任何 Python 3 可以找到它的地方。
稍后,在 Python 3 中,您必须执行以下操作才能开始:
import dpkt
file = open('mypcapfile.pcap','rb')
将打开您的文件。不要忘记 Python 3 中的 'rb'
二进制模式(与 pure-pcapfile
中的一样)。
pcap = dpkt.pcap.Reader(file)
将读取并解码您的文件
for ts, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
print(eth)
将,例如,解码以太网数据包并打印它们。然后阅读有关如何使用 dpkt
的文档。如果您的数据包包含 IP 或 TCP 层,那么 dpkt.ethernet.Ethernet(buf)
也会对其进行解码。另请注意,在 for
循环中,我们可以访问 ts
中的时间戳。
您可能希望以较少约束的形式对其进行迭代,执行以下操作会有所帮助:
(ts,buf) = next(pcap)
eth = dpkt.ethernet.Ethernet(buf)
第一行从 pcap 文件中获取下一个元组。如果 pcap 为 False
,那么您将阅读所有内容。
关于python-3.x - python 3中的pcap文件查看库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879790/