1

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

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

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

以太网(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,运动=56145)))

谁能告诉我如何获得上述输出?

4

3 回答 3

3

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

https://stackoverflow.com/a/15746971

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

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print(eth)
于 2019-12-03T13:09:22.187 回答
0

您尝试执行的操作仅适用于 python REPL shell。当您希望它在 python 脚本中工作时,您需要repr像这样调用该方法:

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

以太网(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,运动=56145)))

我假设您有一个具有正确以太网数据包的 pcap,并且您已经像链路层一样进行了检查。

于 2016-03-12T17:49:38.600 回答
0

如果文件的链路层标头类型不是以太网,那么如果您尝试将数据包解析为以太网数据包,您将不会获得有用的信息。dpkt 文档不是很好,但是有一些方法可以获取链路层标头类型;在任何读取 pcap 文件的程序尝试从原始数据包数据中获取任何内容之前,它必须确定文件中的链路层标头类型,并将其从原始数据包数据中提取信息的方式基于链路层标头类型(如果文件没有可以解析的链接层标头类型,则退出)。

(请随时告诉 Oberheide 先生,他的代码已损坏,因为它没有检查链路层标头类型!)

于 2016-01-04T06:28:48.610 回答