python 3中的pcap文件查看库

时间:2015-06-16 23:12:16

标签: python-3.x pcap

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

理想情况下,我想要一些能够解决诸如wireshark等信息细分的东西,但只是能够读取时间戳并将数据包作为某种字节串返回将是受欢迎的。

问题是所有常用的库都支持很少或没有python 3:dpkt,pylibpcap,pcapy等。

有没有人知道一个与python 3一起使用的pcap库?

1 个答案:

答案 0 :(得分:5)

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

  • pure-pcapfile很容易使用pip在python 3中安装。它非常易于使用,但仍限于解码以太网 IP 数据。其余的留给你。但它适用于开箱即用
  • dpkt无效开箱即用,之前需要进行一些操作。他们将它移植到Python 3并计划为2.0版本提供Python 2和3兼容版本。不幸的是,它还没有。但是,它比pure-pcapfile更完整,可以解码许多协议。如果您的数据包嵌入了多层协议,它将自动为您解码。唯一的问题是你需要在这里和那里进行一些修正以使其起作用(作为撰写本评论的时间)。

纯pcapfile

到目前为止,我发现为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. 的新创建的目录
  4. 切换到包含Python 3代码的分支名称migrate_py3。从这个分支的名称可以看出,它仍然是实验性的。到目前为止它对我有用。
  5. (以防万一)再次下载代码
  6. 然后复制项目中名为dpkt的目录或Python 3可以找到的目录。

    稍后,在Python 3中,您需要执行以下操作:

    import dpkt
    file = open('mypcapfile.pcap','rb')
    

    将打开您的文件。不要忘记Python 3中的'rb'二进制模式(与pure-pcapfile中的相同)。

    pcap = dpkt.pcap.Reader(file)
    

    将读取并解码您的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,那么你就读了所有内容。