我正在尝试从各种CTF事件中读取pcap文件。
理想情况下,我想要一些能够解决诸如wireshark等信息细分的东西,但只是能够读取时间戳并将数据包作为某种字节串返回将是受欢迎的。
问题是所有常用的库都支持很少或没有python 3:dpkt,pylibpcap,pcapy等。
有没有人知道一个与python 3一起使用的pcap库?
答案 0 :(得分:5)
据我所知,至少有2个软件包似乎适用于Python 3: pure-pcapfile
和 dpkt
:
pure-pcapfile
很容易使用pip
在python 3中安装。它非常易于使用,但仍限于解码以太网和 IP 数据。其余的留给你。但它适用于开箱即用。dpkt
无效开箱即用,之前需要进行一些操作。他们将它移植到Python 3并计划为2.0版本提供Python 2和3兼容版本。不幸的是,它还没有。但是,它比pure-pcapfile
更完整,可以解码许多协议。如果您的数据包嵌入了多层协议,它将自动为您解码。唯一的问题是你需要在这里和那里进行一些修正以使其起作用(作为撰写本评论的时间)。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
不适用于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个命令执行以下操作:
dpkt
migrate_py3
。从这个分支的名称可以看出,它仍然是实验性的。到目前为止它对我有用。然后复制项目中名为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
,那么你就读了所有内容。