Python dpkt无效tcpdump标头错误
我收到ValueError:以下代码的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 =
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)
- 这就是我们想要的李>
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