在 python 中解析 PCAP 文件

Parsing a PCAP File in python

我正在尝试解析 python 中的 Pcap 文件。当我运行这个代码

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print eth

我得到的是垃圾值,而不是得到以下输出:

Ethernet(src='\x00\x1a\xa0kUf', dst='\x00\x13I\xae\x84,', data=IP(src='\xc0\xa8\n\n', off=16384, dst='C\x17\x030', sum=25129, len=52, p=6, id=51105, data=TCP(seq=9632694, off_x2=128, ack=3382015884, win=54, sum=65372, flags=17, dport=80, sport=56145)))

任何人都可以告诉我如何获得上面的输出吗?

如果文件的 link-layer header 类型不是以太网,如果您尝试将数据包解析为以太网数据包,您将得不到有用的信息。 dpkt 文档不是很好,但是有一些方法可以获取 link-layer header 类型;在 any 程序读取 pcap 文件使 any 尝试从原始数据包数据中获取 anything 之前,它必须 确定文件中的 link-layer header 类型,并将其从原始数据包数据中提取信息的方式基于 link-layer header type (或退出如果文件没有可以解析的 link-layer header 类型)。

(请随时告诉 Oberheide 先生他的代码有问题,因为它没有检查 link-layer header 类型!)

您尝试做的事情仅在 python REPL shell 中有效。当您希望它在 python 脚本中工作时,您需要像这样调用 repr 方法:

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print repr(eth)  # this is key

Ethernet(src='\x00\x1a\xa0kUf', dst='\x00\x13I\xae\x84,', data=IP(src='\xc0\xa8\n\n', off=16384, dst='C\x17\x030', sum=25129, len=52, p=6, id=51105, data=TCP(seq=9632694, off_x2=128, ack=3382015884, win=54, sum=65372, flags=17, dport=80, sport=56145)))

我假设你有一个 pcap,它有正确的以太网数据包,并且你已经检查了 link 层。

确保文件以二进制形式打开并读取。

f = open(pcapfile, 'rb')
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print(eth)