在 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)
我正在尝试解析 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)