Фильтрация файла 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()