dpkt недопустимая ошибка заголовка tcpdump
Я получаю 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
1 ответов
поскольку я столкнулся с той же ошибкой, вот анализ проблемы.
Примечание: На данный момент это выглядит как проблема, наблюдаемая на 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
это отличается от наших ожиданий.
давайте проверим, является ли это новый формат "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 case)
однако похоже, что в реализации Apple tcpdump есть ошибка.
описание 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