Разбор PCAP в Python 2.6

Я пытаюсь просто проанализировать данные в захвате пакета. Я взял примеры, чтобы посмотреть, смогу ли я скомпилировать, и в итоге получил ошибку. Ниже приведен код.

import dpkt
import sys

f = open('test.pcap')
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
    tcp = ip.data


f.close()

Ошибка, которую я получаю, следующая: Файл "inspection.py", строка 15, в tcp = ip.data

AttributeError: объект «str» не имеет атрибута «данные»

Любая помощь будет оценена по достоинству.


person user1216533    schedule 17.02.2012    source источник
comment
eth.data — это строка. для строк нет атрибута data. Попытка printпопробовать ip   -  person tMC    schedule 17.02.2012
comment
scapy лучше подходит для такого рода вещей, чем dpkt.   -  person This    schedule 17.05.2012


Ответы (2)


Вызов dpkt.ethernet.Ethernet(buf) вернул строку, поскольку класс Ethernet не смог распаковать buf. Вероятная причина этого заключается в том, что в вашем файле pcap нет Ethernet в качестве протокола уровня 2. Вы можете загрузить pcap в Wireshark, чтобы подтвердить это.

Следующий сценарий пытается проверить поле канала передачи данных в файле pcap и использовать соответствующий класс dpkt уровня 2 для декодирования кадра:

import dpkt
import sys

f = open('test.pcap')
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    if pcap.datalink() == dpkt.pcap.DLT_LINUX_SLL:
        l2 = dpkt.sll.SLL(raw_pkt)
    else:
        l2 = dpkt.ethernet.Ethernet(buf)
    ip = l2.data
    tcp = ip.data
person user405925    schedule 17.05.2012
comment
Вероятно, вам следует вызывать dpkt.ethernet.Ethernet только в том случае, если pcap.datalink() возвращает dpkt.pcap.DLT_EN10MB. Существует много возможных типов заголовков канального уровня, и вы должен проверять все типы, которые вы поддерживаете, и терпеть неудачу, если тип не является одним из них. - person ; 25.11.2012

Что я сделал для решения проблемы:

        if ip.p == 6:
           tcp = dpkt.tcp.TCP(ip.data)
person DoD    schedule 19.09.2016
comment
Добро пожаловать в Stack Overflow! Пожалуйста, не публикуйте одинаковые ответы на несколько вопросов. Опубликуйте один хороший ответ, затем отметьте / проголосуйте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не повторяется, адаптируйте свои ответы к вопросу. Повторяющийся ответ можно найти здесь. - person Scott Weldon; 20.09.2016