Функция Scapy и rdpcap

Я использую функцию rdpcap Scapy для чтения файла PCAP. Я также использую модуль, описанный в ссылке на поддержку HTTP в Scapy, что необходимо в моем случае, так как мне нужно получить все HTTP-запросы и ответы, а также связанные с ними пакеты.

Я заметил, что анализ большого файла PCAP функцией rdpcap требует слишком много времени для его чтения.

Есть ли решение для более быстрого чтения файла pcap?


person auino    schedule 29.05.2012    source источник
comment
Насколько велик ваш файл pcap? Сколько времени нужно, чтобы прочитать его? Это действительно слишком долго (даже для того, чтобы загрузить его только один раз)? Сколько раз вы хотите это прочитать (риторический вопрос)?   -  person Dr. Jan-Philip Gehrcke    schedule 29.05.2012
comment
Мой файл больше 300 МБ, мне приходится запускать скрипт Python более одного раза.   -  person auino    schedule 29.05.2012
comment
@auino, в чем конкретно проблема со временем чтения? Дело в том, что разработка вашего сценария занимает слишком много времени, когда вы анализируете файл размером 300 МБ каждый раз, когда вносите изменения, или требуется какая-то обработка в реальном времени? Кроме того, пожалуйста, дайте нам представление о приемлемом времени синтаксического анализа.   -  person This    schedule 29.05.2012
comment
Это занимает около 1 часа... это нехорошо, так как мне нужно разобрать только что загруженные данные...   -  person auino    schedule 29.05.2012
comment
Пожалуйста, используйте голосование, чтобы поблагодарить и не благодарить в вопросе.   -  person Piotr Kula    schedule 25.09.2013


Ответы (4)


В Scapy есть еще один метод sniff, который вы также можете использовать для чтения файлов pcap:

def method_filter_HTTP(pkt):
    #Your processing

sniff(offline="your_file.pcap",prn=method_filter_HTTP,store=0)

rdpcap загружает в память весь файл pcap. Следовательно, он использует много памяти и, как вы сказали, работает медленно. В то время как sniff читает по одному пакету за раз и передает его предоставленной функции prn. Этот параметр store=0 гарантирует, что пакет будет удален из памяти, как только он будет обработан.

person wonder    schedule 22.06.2016

Хотя я согласен, что время загрузки больше, чем можно было бы ожидать, вероятно, это связано с тем, что файл анализируется для создания массива сложных объектов. Что мне пришлось сделать, так это использовать editcap, чтобы нарезать захваченные пакеты, чтобы сделать их чтение немного проще. Например:

$ editcap -B 2013-05-2810:05:55 -i 5 -F libpcap inputcapture.pcap outputcapture.pcap

Обратите внимание: полное объяснение переключателей этой команды доступно здесь.

Кроме того, часть -F libpcap казалась необходимой (по крайней мере, для меня), чтобы функция pcap scapy могла анализировать файл. (Предполагается, что это формат вывода файла pcap по умолчанию, но по какой-то причине это не так для меня. Вы можете проверить тип файла ваших входных и выходных файлов с помощью capinfos (например, просто введите capinfos your_capture.pcap).

И capinfos, и editcap доступны в дистрибутиве WireShark.

person vincent    schedule 30.05.2013

Если вам нужен более отзывчивый код, рассмотрите возможность использования PcapReader() вместо rdpcap().

PcapReader() создает генератор и загружает пакет только тогда, когда это необходимо, в отличие от rdpcap(), который загружает всю трассировку в память. Таким образом, PcapReader() хорошо подходит для большой трассировки, которая вечно загружается с rdpcap() или выдает MemoryError, потому что она слишком велика для вашей системы.

Пример кода:

packets = PcapReader('filename.pcap')
for packet in packets:
    mac_src = packet[Ether].src
    mac_dst = packet[Ether].dst
    ...

См. PcapReader() документацию. Чтобы получить больше информации.

Если вас беспокоит только то, сколько времени потребуется для получения окончательного результата, то rdpcap() может иметь преимущество перед PcapReader(), хотя я не уверен в величине разницы.

person Sata    schedule 16.05.2020

Начиная с Scapy 2.4.3, он имеет встроенную поддержку для анализа HTTP. сессии. Его можно использовать с sniff() сеансами. функциональность. например

pkts = sniff(offline="http_chunk.pcap.gz", session=TCPSession, store=0)

При использовании функции TCPsession с захватом HTTP/1 он возвращает список «пакетов», которые содержат собранные данные из всех базовых пакетов, составляющих каждый HTTPRequest, HTTPResponse. Он также будет возвращать отдельные пакеты, такие как пакеты Ack. Так, например, проверка того, содержит ли «пакет» haslayer(HTTPResponse), то этот «пакет» содержит всю полезную нагрузку ответа. Также можно использовать ссылку answers() для сопоставления запросов и ответов. Обратите внимание, что вы можете использовать sniff() для захвата в реальном времени, или с захватом пакетов offline, или списком пакетов.

person Pierz    schedule 17.12.2020