我收到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
答案 0 :(得分:10)
由于我遇到了同样的错误,这里是问题分析。
注意:目前在MacOS上观察到的问题只是在Linux上tcpdump按预期工作。
1)man tcpdump
指的是pcap格式:
如果您打开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
这与我们的期望不同。
让我们检查这是否是一种新格式&#34; pcap-ng&#34;。 我们可以从http://www.winpcap.org/ntar/draft/PCAP-DumpFileFormat.html开始阅读:
块类型:Section Header Block的块类型是整数 对应于4字符串&#34; \ r \ n \ n \ r&#34; (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
(mac0 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