从包的ISO/OSI层过滤PCAP文件



我需要将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.5GB),因为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(...)函数不作为追加)?

我已经(至少显然)用这种方式解决了:

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()

相关内容

  • 没有找到相关文章

最新更新