Фильтрация файла PCAP из уровня пакета ISO/OSI

Мне нужно разделить файл PCAP на два разных файла: первый должен включать все (и только) пакеты, направленные на прикладной уровень модели ISO/OSI, а второй - все остальные.

Я использую Scapy, чтобы применить фильтр:

pkts = PcapReader(infile)
applayerpkts = (pkt for pkt in pkts if pkt.haslayer(Raw))
lowlayerspkts = (pkt for pkt in pkts if not pkt.haslayer(Raw))
wrpcap(applayerfilename, applayerpkts)
wrpcap(lowlayersfilename, lowlayerspkts)

с помощью pkt.haslayer(Raw) метод, так как этот уровень должен быть включен только в пакеты, направленные на прикладной уровень.

В чем проблема? Я заметил, что сумма applayerfilename + lowlayersfilename (по размеру файла) отличается (меньше) от размера файла infile,

Описанный метод также является вычислительно дорогим (и у меня есть список PCAP размером ~1,5 ГБ каждый), так как infile анализируется дважды.

Я предпочел бы применить другой фильтр, анализируя один раз входной PCAP. Я мог бы использовать PcapReader класс и вручную анализирует PCAP, но я не знаю, как сгенерировать PCAP для передачи в wrpcap(...) метод.

Изменить: я также пытался с этим решением:

pkts = PcapReader(infile)
app_pkts = []
low_pkts = []
for p in pkts:
    if p.haslayer(Raw):
        app_pkts.append(p)
    else:
        low_pkts.append(p)
wrpcap(applayerfilename, app_pkts)
wrpcap(lowlayersfilename, low_pkts)

но это не работает, так как он занимает слишком много памяти из-за размера моего входного PCAP...

Делает append_to_pcap(filename, packet) подобная функция существует (wrpcap(...) функция не работает как приложение)?

1 ответ

Я (по крайней мере, по-видимому) решил таким образом:

pkts = PcapReader(infile)

app_writer = PcapWriter(applayerfilename, append=True)
low_writer = PcapWriter(lowlayersfilename, append=True)
for p in pkts:
    if p.haslayer(Raw):
        app_writer.write(p)
    else:
        low_writer.write(p)
app_writer.close()
low_writer.close()
Другие вопросы по тегам