使用dpkt解析pcap文件

3

我是一名初学者,正在处理一个pcap文件的任务中,使用dpkt来完成解析。由于对网络不太熟悉,所以在调试代码和入门方面遇到了很大的困难。

第一段代码:

import dpkt

filename='test.pcap'
f = open(filename)
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
    tcp = ip.data

f.close()

错误是AttributeError: 'str'对象没有属性'data'

所以从之前的Stackoverflow中,我发现可能应该“跳过dpkt以太网解码并直接转到IP解码”,因此我修改了代码并跳到:

import dpkt

filename='test.pcap'

f = open(filename)
pcap = dpkt.pcap.Reader(f)

for ts,buf in pcap:
    ip = dpkt.ip.IP(buf)
    tcp = ip.data

f.close()

它现在给我的错误是“UnpackError:无效的头长度”
不太明白如何继续下去,请帮忙,非常感谢。

1
你能分享pcap文件吗? - Kiran Bandla
2个回答

7

我在我的手机上记录迹象时也遇到了同样的问题。

这是由于以太网被Linux Cooked Capture替代所致。如果您的迹象以类似的方式封装,您将需要使用dpkt.sll.SLL(buff)而不是dpkt.ethernet.Ethernet(buf)。以下是一个例子:

import dpkt

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

for ts, buf in pcap:
    eth = dpkt.sll.SLL(buf)
    ip = eth.data
    tcp = ip.data
f.close()

3

这通常发生在Windows上。在Windows上,您应该以二进制模式打开pcap文件:

f = open('test.pcap', 'rb')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接