我需要将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()