Разбор файла PCAP в python

Я пытаюсь разобрать файл Pcap в python. Когда я запускаю этот код

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print eth

Я получаю ненужные значения вместо получения следующего вывода:

Ethernet(src='\x00\x1a\xa0kUf', dst='\x00\x13I\xae\x84,', data=IP(src='\xc0\xa8\n\n', off=16384, dst= 'C\x17\x030', сумма = 25129, длина = 52, p = 6, идентификатор = 51105, данные = TCP (seq = 9632694, off_x2 = 128, подтверждение = 3382015884, выигрыш = 54, сумма = 65372, флаги = 17, дпорт=80, спорт=56145)))

может кто-нибудь, пожалуйста, скажите мне, как получить этот вывод выше?


person Normal one    schedule 04.01.2016    source источник
comment
ссылка из: jon. oberheide.org/blog/2008/10/15/   -  person Normal one    schedule 04.01.2016


Ответы (3)


Убедитесь, что файл открыт для чтения как двоичный.

https://stackoverflow.com/a/15746971

f = open(pcapfile, 'rb')
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print(eth)
person user12474146    schedule 03.12.2019

Если тип заголовка файла канального уровня не Ethernet, вы не получите полезной информации, если попытаетесь проанализировать пакеты как пакеты Ethernet. Документация dpkt не очень хороша, но есть способ получить тип заголовка канального уровня; прежде чем какая-либо программа, читающая pcap-файл, предпримет любую попытку получить что-либо из необработанных пакетных данных, она должна определить тип заголовка канального уровня в файле и основывать способ извлечения информации из необработанных данных пакета на ссылке. -тип заголовка уровня (или выйти, если файл не имеет типа заголовка уровня ссылки, который он может анализировать).

(И не стесняйтесь сказать г-ну Оберхайде, что его код неисправен, потому что он не проверяет тип заголовка канального уровня!)

person Community    schedule 04.01.2016

То, что вы пытались сделать, работает только в оболочке python REPL. Если вы хотите, чтобы он работал из скрипта Python, вам нужно вызвать метод repr следующим образом:

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    print repr(eth)  # this is key

Ethernet(src='\x00\x1a\xa0kUf', dst='\x00\x13I\xae\x84,', data=IP(src='\xc0\xa8\n\n', off=16384, dst= 'C\x17\x030', сумма = 25129, длина = 52, p = 6, идентификатор = 51105, данные = TCP (seq = 9632694, off_x2 = 128, подтверждение = 3382015884, выигрыш = 54, сумма = 65372, флаги = 17, дпорт=80, спорт=56145)))

Я предполагаю, что у вас есть pcap, который имеет правильные пакеты Ethernet, и вы проверили, как канальный уровень.

person Kiran Bandla    schedule 12.03.2016