dpkt无效tcpdump标头错误

Cor*_*sum 7 python parsing pcap libpcap

我得到ValueError:下面的代码无效tcpdump标头错误.任何帮助赞赏

import dpkt

f = open('a.pcap')
pcap = dpkt.pcap.Reader(f)

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

if tcp.dport == 80 and len(tcp.data) > 0:
    http = dpkt.http.Request(tcp.data)
    print http.uri

f.close()
Run Code Online (Sandbox Code Playgroud)

错误如下所示

Traceback (most recent call last):
File "malcap.py", line 6, in <module>
pcap = dpkt.pcap.Reader(f)
File "/usr/lib/python2.7/site-packages/dpkt/pcap.py", line 104, in __init__
raise ValueError, 'invalid tcpdump header'
ValueError: invalid tcpdump header
Run Code Online (Sandbox Code Playgroud)

小智 11

由于我遇到了同样的错误,这里是问题分析.

注意:目前看起来只在MacOS上观察到问题,而在Linux上tcpdump按预期工作.

1)man tcpdump指pcap格式:

有关文件格式的说明,请参阅pcap-savefile(5).

如果您打开PCAP-SAVEFILE文档,您可能会看到:

每个文件头中的第一个字段是一个4字节的幻数,值为0xa1b2c3d4

2)从pcap.py你可能会看到下一个:

elif self.__fh.magic != TCPDUMP_MAGIC:
    raise ValueError, 'invalid tcpdump header'
Run Code Online (Sandbox Code Playgroud)

3)基于1)和2)我们可以确定文件不是pcap.

我们来看看hexdump:

hexdump test1.pcap  0000000 0a 0d 0d 0a
Run Code Online (Sandbox Code Playgroud)

这与我们的期望不同.

让我们检查一下这是一种新格式"pcap-ng".从http://www.winpcap.org/ntar/draft/PCAP-DumpFileFormat.html我们可以阅读下一篇文章:

块类型:段头块的块类型是对应于4字符串"\ r \n \n\r"(0x0A0D0D0A)的整数.

  • 这就是我们想要的!

4)由于我们正在使用pylibpcap并且不支持pcap-ng(目前)我们需要以某种方式处理这个问题.

有两种选择:4.1)使用editcap工具:

editcap -F libpcap -T ether test.pcapng test.pcap
Run Code Online (Sandbox Code Playgroud)

4.2)使用dumpcap工具收集数据,该工具支持两种格式的数据存储(对于旧格式使用-P).即:

dumpcap -P -i en0 -w test.pcap
Run Code Online (Sandbox Code Playgroud)

(用于macbook air case的en0)

但是看起来Apple tcpdump实现中存在一个错误.

tcpdump的Mac OS说明下一步说:

   -P     Use the pcap-ng file format when saving files.  Apple modification.
Run Code Online (Sandbox Code Playgroud)

如果你运行tcpdump(没有-P且没有指定-i接口):

tcpdump -w test.pcap
hexdump test.pcap
Run Code Online (Sandbox Code Playgroud)

你会看到pcap-ng格式的结果:

bash-3.2$ hexdump test.pcap  0000000 0a 0d 0d 0a
Run Code Online (Sandbox Code Playgroud)

如果您使用指定的接口运行tcpdump:

tcpdump -w test.pcap -i en0
Run Code Online (Sandbox Code Playgroud)

格式是正确的:

bash-3.2$ hexdump test.pcap  0000000 d4 c3 b2 a1 02
Run Code Online (Sandbox Code Playgroud)