Python Scapy wrpcap - Как вы добавляете пакеты в файл pcap? - PullRequest
9 голосов
/ 27 сентября 2011

У меня есть программное обеспечение, которое может эмулировать такие вещи, как BER и задержки в сети. Мне нужен способ проверить модуль BER программного обеспечения, чтобы убедиться, что он действительно работает правильно. Мое решение состоит в том, чтобы создать программу, которая отправляет необработанные кадры Ethernet с полем типа, установленным в неиспользуемый тип. Внутри кадра Ethernet просто случайные биты. Для каждого отправленного кадра мне нужно записать кадр в файл pcap. На другой стороне сетевого канала будет получающее приложение, которое просто записывает каждый увиденный пакет в свой собственный журнал pcap. После завершения теста два журнала pcap будут сравниваться, чтобы получить BER.

Я использую модуль Python Scapy, и пока он сделал все, что мне нужно. Я могу отправлять необработанные кадры Ethernet со случайными данными и видеть их в Wireshark. Однако я не знаю, как заставить метод wrpcap() добавлять в файл pcap вместо перезаписи. Я знаю, что могу написать список пакетов в wrpcap, но это приложение должно быть в состоянии работать в течение неопределенного периода времени, и я не хочу ждать, пока приложение закроется, чтобы записать все пакеты, отправленные в жесткий диск Поскольку это будет много для хранения в памяти, и если что-то случится, мне придется начинать тестирование с нуля.

У меня вопрос: как добавить файл pcap, используя scapy вместо перезаписи файла pcap? Это вообще возможно? Если нет, то какой модуль может делать то, что мне нужно?

При поиске чего-то с возможностями Scapy я столкнулся с dpkt, но я не нашел много документации для этого. Может ли dpkt делать то, что я прошу, и если да, то где я могу получить хорошую документацию для этого?

Ответы [ 4 ]

14 голосов
/ 26 декабря 2013

Для потомков PcapWriter или RawPcapWriter выглядит более простым способом решения этой проблемы в scapy 2.2.0.Не могу найти много документации, кроме просмотра источника, хотя.Краткий пример:

from scapy.utils import PcapWriter

pktdump = PcapWriter("banana.pcap", append=True, sync=True)

...
pktdump.write(pkt)
...
6 голосов
/ 29 ноября 2011

Есть способ сделать то, что вы хотите, но это означает либо:

  • [Захват памяти с одним большим pcap]: считывание существующего pcap с диска сrdpcap() в scapy PacketList(), а затем записывать кадры в PacketList по мере их получения.Вы можете выборочно сохранить промежуточное значение PacketList в pcap по своему желанию, но я не думаю, что есть что-то вроде способности добавления в scapy * wrpcap().Как вы упомянули, эта техника также означает, что вы сохраняете всю PacketList в памяти до завершения.

  • [Склеивать отдельные pcap файлы вместе]: сохраняйте только небольшие снимки пакетовв памяти ... вы должны сохранять pcap моментальных снимков на X-минутной основе на диск, а затем объединять эти отдельные файлы вместе после завершения сценария.

Вы можете комбинироватьpcap файлов в linux с mergecap из пакета wireshark ... Следующая команда объединит pak1.pcap и pak2.pcap в all_paks.pcap:

mergecap -w all_paks.pcap pak1.pcap pak2.pcap

Что касается dpkt, я просмотрел их источник, и он мог бы постепенно записывать пакеты, но я не могу сказать, насколько стабильна или поддерживается их кодовая база ... это выглядитбит игнорируется в журналах фиксации (последний коммит был 9 января 2011 г.).

0 голосов
/ 23 февраля 2018

Функция wrpcap() может использоваться для добавления, если вы включите ключевое слово аргумент append=True.Например:

pkt = IP()
wrpcap('/path/to/filename.pcap', pkt, append=True)
pkt2 = IP()
wrpcap('/path/to/filename.pcap', pkt2, append=True)

rdpcap('/path/to/filename.pcap')

<filename.pcap: TCP:0 UDP:0 ICMP:0 Other:2>

Примечание: wrpcap открывает и закрывает дескриптор файла при каждом вызове.Если у вас есть дескриптор открытого файла для файла pcap, он будет закрыт после вызова wrpcap().

0 голосов
/ 19 апреля 2012

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

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

#!/usr/bin/python -tt

from scapy.all import *

pkts = []
iter = 0
pcapnum = 0

def makecap(x):
    global pkts
    global iter
    global pcapnum
    pkts.append(x)
    iter += 1
    if iter == 500:
        pcapnum += 1
        pname = "pcap%d.pcap" % pcapnum
        wrpcap(pname, pkts)
        pkts = []
        iter = 0

while 1:
    sniff(prn=makecap)

Это должно дать вам немного рычагов, однако последние несколько пакетов могут быть потеряны (уменьшите значение в операторе if, чтобы смягчить это.) Предложите использовать его с обеих сторон одновременно, чтобы каждый pcap выстраивался в линию, Позже вы можете использовать mergepcap, как советует Майк, если хотите. Дайте мне знать, если это работает для вас.

...