dpkt 无效的 tcpdump 头部错误

7 投票
1 回答
12691 浏览
提问于 2025-04-18 05:42

我在运行下面的代码时遇到了一个错误,提示“ValueError: Invalid tcpdump header”。希望能得到一些帮助。

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()

错误信息如下:

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

1 个回答

14

我遇到了同样的错误,所以这里分析一下问题。

注意:目前看起来这个问题只在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'

3) 根据1)和2),我们可以确定这个文件不是pcap格式。

让我们用hexdump检查一下:

hexdump test1.pcap  0000000 0a 0d 0d 0a

这和我们的预期不一样。

接下来我们检查一下这是否是新格式“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

4.2) 使用dumpcap工具收集数据,它支持两种格式的数据存储(使用-P选项可以选择旧格式)。也就是说:

dumpcap -P -i en0 -w test.pcap

(en0是macbook air的情况)

不过看起来Apple的tcpdump实现中有个bug。

Mac OS对tcpdump的描述是这样的:

   -P     Use the pcap-ng file format when saving files.  Apple modification.

如果你运行tcpdump(不加-P选项,也不指定-i接口):

tcpdump -w test.pcap
hexdump test.pcap

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

bash-3.2$ hexdump test.pcap  0000000 0a 0d 0d 0a

而如果你运行tcpdump并指定了接口:

tcpdump -w test.pcap -i en0

格式就会正确:

bash-3.2$ hexdump test.pcap  0000000 d4 c3 b2 a1 02

撰写回答