Есть ли способ с помощью libpcap определить смещение файла захваченного пакета из автономного файла pcap?

Я пишу программу для восстановления потоков TCP, захваченных Snort. Большинство примеров, которые я читал относительно реконструкции сеанса:

  • загрузить весь файл pcap в память для начала (не решение из-за аппаратных ограничений и того факта, что размер некоторых файлов захвата составляет 10 ГБ), или
  • кэшировать каждый пакет в памяти при чтении перехвата и отбрасывать ненужные по мере прохождения; это представляет в основном те же проблемы, что и чтение всего файла в память

Мое текущее решение состояло в том, чтобы написать свой собственный анализатор файлов pcap, поскольку формат прост. Я сохраняю смещения каждого пакета в векторе и могу перезагрузить каждый после того, как я его передал. Это, как и libpcap, передает в память только один пакет за раз; Я использую только порядковые номера и флаги для упорядочения, а НЕ данные пакета. В отличие от libpcap, он заметно медленнее. обработка захвата 570 МБ с помощью libpcap занимает примерно 0,9 секунды, тогда как мой код занимает 3,2 секунды. Однако у меня есть преимущество в том, что я могу искать назад, не перезагружая весь захват.

Если бы я придерживался libpcap из-за проблем со скоростью, я подумал, что мог бы просто создать переменную currentOffset с начальным значением 24 (размер глобального заголовка файла pcap), помещая ее в вектор каждый раз, когда я загружаю новый пакет , и увеличиваю его каждый раз, когда я вызываю pcap_next_ex на размер пакета + 16 (для размера заголовка записи pcap). Затем, всякий раз, когда я хотел прочитать отдельный пакет, я мог загрузить его с помощью обычных средств и искать packetOffsets[packetNumber].

Есть ли лучший способ сделать это с помощью libpcap?


person jvstech    schedule 27.07.2012    source источник


Ответы (1)


Сам решил проблему.

Перед вызовом pcap_next_ex я вставляю ftell(pcap_file(myPcap)) в vector<unsigned long>. После этого я вручную анализирую пакеты по мере необходимости.

ЭЗПЗ. Это просто заняло 24+ часа мозгового штурма...

person jvstech    schedule 28.07.2012