【问题标题】:dpkt invalid tcpdump header errordpkt 无效的 tcpdump 标头错误
【发布时间】:2014-06-24 18:26:20
【问题描述】:

我收到 ValueError: Invalid tcpdump header error for below code。任何帮助表示赞赏

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

【问题讨论】:

  • 您是否尝试过在任何其他工具(如 Wireshark)中打开 pcap 文件以确认其有效且未损坏?
  • 是的,试过了。它适用于wireshark
  • “它适用于 Wireshark”并不意味着“它是一个 pcap 文件”;例如,它可以是一个 pcap-ng 文件,新版本的 libpcap 可以读取,但旧版本的 libpcap 和用于读取 pcap 文件的手写代码不能。在 Wireshark 中,转到 Statistics -> Summary 并查看“格式:”的含义。

标签: python parsing pcap libpcap


【解决方案1】:

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

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

1)man tcpdump指pcap格式:

See pcap-savefile(5) for a description of the file format.

如果您打开 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我们可以阅读下一个:

Block Type:Section Header Block的块类型是整数 对应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

(macbook air case en0)

不过,Apple tcpdump 实施中似乎存在错误。

tcpdump 的 Mac OS 描述如下:

   -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

【讨论】:

  • Mavericks tcpdump 手册页还提到将 pcap-ng 用于“pktap”伪接口,并且默认情况下捕获“一组由内核定义的接口”。不幸的是,它不会告诉你这意味着,默认情况下,它在 pktap 伪接口上捕获,因此默认情况下它会写出一个 pcap-ng 文件。 (即,错误在文档中,而不是代码中。)
  • 嗯,即使指定接口,我仍然收到pcap-ng。另外,不确定在哪里可以找到 editcapdumpcap 工具 - 有什么帮助吗?
  • @dwanderson 这两个工具都与wireshark打包在一起。
猜你喜欢
  • 2014-03-25
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2017-08-23
  • 2016-07-15
  • 2014-04-27
相关资源
最近更新 更多