Python dpkt无效tcpdump标头错误

Python dpkt无效tcpdump标头错误,python,parsing,pcap,libpcap,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 =

我收到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()
错误如下所示

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
回溯(最近一次呼叫最后一次):
文件“malcap.py”,第6行,在
pcap=dpkt.pcap.Reader(f)
文件“/usr/lib/python2.7/site packages/dpkt/pcap.py”,第104行,在__
raise VALUE错误,“无效的tcpdump标头”
ValueError:无效的tcpdump标头

由于我遇到了相同的错误,下面是问题分析

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

1)
手动tcpdump
指的是pcap格式:

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

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

2) 从pcap.py中,您可以看到下一步:

elif self.__fh.magic != TCPDUMP_MAGIC:
    raise ValueError, 'invalid tcpdump header'
3) 根据1)和2)我们可以确定该文件不是pcap

让我们用hextump检查一下:

hexdump test1.pcap  0000000 0a 0d 0d 0a
这与我们的期望不同

让我们检查一下这是否是一种新格式“pcap ng”。 下面我们可以看到:

块类型:节头块的块类型为整数 对应于4字符字符串“\r\n\n\r”(0x0A0D0A)

  • 这就是我们想要的
4) 由于我们正在与pylibpcap合作,并且(目前)没有对pcap ng的支持,因此我们需要以某种方式处理这个问题

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

editcap -F libpcap -T ether test.pcapng test.pcap
4.2)使用dumpcap工具收集数据,该工具支持两种格式的数据存储(使用-p表示旧格式)。即:

(适用于macbook air机箱的en0)

不过,苹果tcpdump的实现似乎存在缺陷。

tcpdump的Mac OS说明如下:

如果运行tcpdump(不带-p,也不指定-i接口):

您将看到pcap ng格式的结果:

bash-3.2$ hexdump test.pcap  0000000 0a 0d 0d 0a
而如果使用指定的接口运行tcpdump:

tcpdump -w test.pcap
hexdump test.pcap
tcpdump -w test.pcap -i en0
格式正确:

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

您是否尝试过使用任何其他工具(如Wireshark)打开pcap文件以确认其有效且未损坏?是,尝试过。它与wireshark一起工作“它与wireshark一起工作”并不意味着“它是一个pcap文件”;例如,它可能是一个pcap ng文件,较新版本的libpcap可以读取该文件,但较旧版本的libpcap和用于读取pcap文件的手写代码不能读取该文件。在Wireshark中,转到Statistics->Summary,查看“Format:”所说的内容。Mavericks tcpdump手册页还提到将pcap ng用于“pktap”伪接口,以及默认情况下在“内核定义的一组接口”上进行捕获。不幸的是,它并不费心告诉您,这意味着默认情况下,它在pktap伪接口上捕获,因此默认情况下会写出一个pcap ng文件。(也就是说,bug在文档中,而不是代码中。)嗯,即使指定了接口,我仍然得到
pcap ng
。另外,不确定在哪里可以找到
editcap
dumpcap
工具-有帮助吗?@dwanderson这两种工具都是随wireshark打包的。
tcpdump -w test.pcap -i en0
bash-3.2$ hexdump test.pcap  0000000 d4 c3 b2 a1 02