Проблема чтения пакетов из файла pcap. модуль дпкт. Что дает? - PullRequest
0 голосов
/ 22 марта 2010

Я запускаю следующий тестовый скрипт, чтобы попытаться прочитать пакеты из загруженного мной образца .pcap файла. Кажется, он не побежит. У меня есть все модули, но примеры, похоже, не работают.

import socket
import dpkt
import sys
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))
for ts, data in pcapReader:
    ether = dpkt.ethernet.Ethernet(data)
    if ether.type != dpkt.ethernet.ETH_TYPE_IP: raise
    ip = ether.data
    src = socket.inet_ntoa(ip.src)
    dst = socket.inet_ntoa(ip.dst)
    print "%s -> %s" % (src, dst)

По какой-то причине это неправильно интерпретируется. При запуске я получаю

KeyError: 138

module body   in test.py at line 4
function __init__     in pcap.py at line 105
Program exited.

Почему это? В чем дело? Есть ли проблема с моей установкой? Я использую Python 2.6 на Mac

Ответы [ 4 ]

1 голос
/ 10 февраля 2011

До

<code>
pcapReader = dpkt.pcap.Reader(open('test1.pcap'))

Вместо:

<code>
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))
1 голос
/ 18 мая 2012

Строка 105 модуля dpkt.pcap использует тип ссылки файла pcap для доступа к словарю сопоставлений типов ссылок:

        self.dloff = dltoff[self.__fh.linktype]

Словарь dltoff определен в верхней части модуля и не содержит ключа 138, следовательно, вы видите исключение. Согласно странице типов ссылок tcpdump значение 138 является типом ссылки для LINKTYPE_APPLE_IP_OVER_IEEE1394. Если это не тот тип ссылки, который вы ожидаете, файл pacp может быть поврежден. В противном случае вы можете попробовать обновить словарь dltoff и добавить запись для 138. Согласно его структуре пакета его заголовок имеет длину 18 байт. Поэтому добавление следующих инструкций после строки 40 файла dkpt / pcap.py должно работать:

        LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
        dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18
0 голосов
/ 11 апреля 2017

Я также сталкивался с подобными проблемами, но у меня была KEY ERROR 192.

Я обнаружил, что мой dkpt/pcap.py не завершен и является очень старой версией.

Поэтому я удалил текущуюпакет

sudo apt-get remove python-dpkt

Используйте pip для ввода последней версии

pip install dpkt

И это наконец решило проблему, удачи вам!

0 голосов
/ 22 марта 2010

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

(1) Вы смотрели на строку 105 файла pcap.py?Я предполагаю, что «KeyError: 138» означает, что он пытается получить доступ к словарю, но словарь не имеет 138 (или «138») в качестве ключа.Какая переменная содержит 138?Байт из пакета?

(2) Попробуйте задать вопрос автору / сопровождающему pcap.

(3) Рассмотрите возможность предоставления URL для pcap.

...