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(5).

и если вы откроете документ 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