Разбор файла 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', выкл =16384, dst='C\x17\x030', sum=25129, len=52, p=6, id=51105, data=TCP(seq=9632694, off_x2=128, ack=3382015884, win=54, sum=65372, flags=17, дпорт = 80, спорт =56145)))
Может кто-нибудь сказать, пожалуйста, как получить этот вывод выше?
2 ответа
Убедитесь, что файл открыт для чтения как двоичный.
/questions/38815187/v-chem-raznitsa-mezhdu-rezhimami-rb-i-rb-v-fajlovyih-obektah/38815198#38815198
f = open(pcapfile, 'rb')
pcap = dpkt.pcap.Reader(f)
for ts, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
print(eth)
Если тип заголовка канального уровня файла не Ethernet, вы не получите полезную информацию, если попытаетесь проанализировать пакеты как пакеты Ethernet. Документация по dpkt не очень хороша, но есть некоторый способ получить тип заголовка канального уровня; прежде чем какая-либо программа, считывающая файл pcap, попытается получить что-либо из необработанных пакетных данных, она должна определить тип заголовка канального уровня в файле и основать способ извлечения информации из необработанных пакетных данных из заголовка канального уровня. type (или выход, если файл не имеет типа заголовка канального уровня, который он может анализировать).
(И не стесняйтесь сообщить г-ну Оберхайде, что его код не работает, потому что он не проверяет тип заголовка канального уровня!)
То, что вы пытались сделать, работает только в оболочке 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', выкл =16384, dst='C\x17\x030', sum=25129, len=52, p=6, id=51105, data=TCP(seq=9632694, off_x2=128, ack=3382015884, win=54, sum=65372, flags=17, дпорт = 80, спорт =56145)))
Я предполагаю, что у вас есть pcap, который имеет надлежащие пакеты Ethernet, и вы проверили, как на канальном уровне.