2012-02-17 3 views
2

Я пытаюсь просто проанализировать данные в захвате пакетов. Я привел примеры только для того, чтобы увидеть, могу ли я скомпилировать, и я получаю ошибку. Ниже приведен код.Parsing PCAP in 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, в ТСР = ip.data

AttributeError: 'ул' объект имеет атрибута 'данные'

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

+0

'eth.data' - это строка. для строк нет атрибута 'data'. Попытка 'print'ing' ip' – tMC

+1

'scapy' - лучший вариант для такого рода вещей, как' dpkt'. –

ответ

3

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

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

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 
+0

Возможно, вы должны только вызвать 'dpkt.ethernet.Ethernet', если' pcap.datalink() 'возвращает' dpkt.pcap.DLT_EN10MB'. Существуют [* * * возможные типы заголовков link-layer] (http://www.tcpdump.org/linktypes.html), и вы должны проверить все типы, которые вы поддерживаете, и сбой, если этот тип не является одним из те. –

0

Что я сделал, чтобы решить эту проблему, был:

 if ip.p == 6: 
      tcp = dpkt.tcp.TCP(ip.data) 
+0

Добро пожаловать в переполнение стека! Пожалуйста, не отправляйте идентичные ответы на несколько вопросов. Отправьте один хороший ответ, затем отметьте/голосуйте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не является дубликатом, * приложите ответы на вопрос. * Дублированный ответ найден [здесь] (// stackoverflow.com/a/39583474/2747593). –