python-3.x - python 3中的pcap文件查看库

标签 python-3.x pcap

我正在尝试从各种 CTF 事件中读取 pcap 文件。

理想情况下,我想要一些可以分解信息的东西,例如 wireshark,但只要能够读取时间戳并将数据包作为某种类型的字节串返回,我会很受欢迎。

问题是几乎没有或没有对所有常用库的 python 3 支持:dpkt、pylibpcap、pcapy 等。

有人知道可以与 python 3 一起使用的 pcap 库吗?

最佳答案

据我所知,至少有 2 个包似乎适用于 Python 3:pure-pcapfiledpkt :

  • pure-pcapfile 使用 pip 很容易安装在 python 3 中。它非常易于使用,但仍然仅限于解码EthernetIP 数据。剩下的就交给你了。但它开箱即用
  • 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 个命令执行以下操作:

  1. 从其在 github 上的 git 存储库克隆(下载)代码
  2. 进入名为dpkt的新创建目录
  3. 切换到包含 Python 3 代码的分支名称 migrate_py3。从这个分支的名称可以看出,它仍处于试验阶段。到目前为止它对我有用。
  4. (以防万一)再次下载代码

然后将名为 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/

相关文章:

python-3.x - 有python的结构分析库吗?

python - setup.py 脚本无法识别模块

python - pip install pcapy 无法打开包含文件 'pcap.h'

基于Python的Socket程序接受libPcap(C-based)

对 libcap (pcap) 和无线感到困惑

javascript - 如何更新多行字形的 ColumnDataSource 数据?

python-3.x - 如何使用python-camelot获取表格坐标?

python - 求一个字符串中能被数字k整除的子串的个数

pcap - 过滤 pcap 的前十分钟

linux - libpcap 网络流量拦截