我正在尝试从各种CTF事件中读取pcap文件.
理想情况下,我想要一些可以解决诸如wireshark之类的信息细分的东西,但只是能够读取时间戳并以某种字节串的形式返回数据包将是受欢迎的.
问题是所有常用的库都很少或没有python 3支持:dpkt,pylibpcap,pcapy等.
有谁知道一个与python 3一起使用的pcap库?
据我所知,至少有2个软件包似乎与Python 3一起使用:pure-pcapfile和dpkt:
pure-pcapfile很容易安装在python 3中使用pip.它非常易于使用,但仍限于解码以太网和IP数据.其余的留给你.但它开箱即用.dpkt开箱即用不起作用,之前需要一些操作.他们将它移植到Python 3并计划为2.0版本提供Python 2和3兼容版本.不幸的是,它还没有.但是,它比pure-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)
Run Code Online (Sandbox Code Playgroud)
如果一切顺利,你应该看到这样的事情:
[+] attempting to load mypcapfile.pcap
[+] found valid header
[+] loaded 1234 packets
[+] finished loading savefile.
Run Code Online (Sandbox Code Playgroud)
现在说几句话.我正在使用Python 3.4.3.并且做import pcapfile不会导入任何东西(我仍然是Python的初学者),但是包中唯一的基本信息和功能.接下来,您必须通过'rb'在open()函数中传递模式以读取二进制模式显式打开文件.在文档中,他们没有明确说明.
其余的就像在文档中:
packet = pcapfile.packets[12]
Run Code Online (Sandbox Code Playgroud)
访问数据包号12(然后是第13个数据包,第一个数据包为0).你有基本的功能,如
packet.timestamp
Run Code Online (Sandbox Code Playgroud)
得到一个时间戳或
packet.raw()
Run Code Online (Sandbox Code Playgroud)
获取原始数据.
该文档提到了对以太网和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
Run Code Online (Sandbox Code Playgroud)
这4个命令执行以下操作:
dpktmigrate_py3包含Python 3代码的分支名称.从这个分支的名称可以看出,它仍然是实验性的.到目前为止它对我有用.然后复制dpkt项目中指定的目录或Python 3可以找到的目录.
稍后,在Python 3中,您需要执行以下操作:
import dpkt
file = open('mypcapfile.pcap','rb')
Run Code Online (Sandbox Code Playgroud)
将打开您的文件.不要忘记'rb'Python 3中的二进制模式(与中的相同pure-pcapfile).
pcap = dpkt.pcap.Reader(file)
Run Code Online (Sandbox Code Playgroud)
将读取和解码你的 file
for ts, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
print(eth)
Run Code Online (Sandbox Code Playgroud)
例如,将解码以太网数据包并打印它们.然后阅读有关如何使用的文档dpkt.如果您的数据包包含IP或TCP层,那么dpkt.ethernet.Ethernet(buf)也将解码它们.另请注意,在for循环中,我们可以访问时间戳ts.
您可能希望以较少约束的形式迭代它,并执行以下操作将有助于:
(ts,buf) = next(pcap)
eth = dpkt.ethernet.Ethernet(buf)
Run Code Online (Sandbox Code Playgroud)
第一行从pcap文件获取下一个元组.如果是pcap False那么你就读了一切.
| 归档时间: |
|
| 查看次数: |
7605 次 |
| 最近记录: |