我需要将PCAP文件拆分为两个不同的文件:第一个应该包括所有(并且只有)指向ISO / OSI模型的应用层的数据包,而第二个包括所有其他文件。 / p>
我正在使用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
的文件大小不同(较低)。
报告的方法在计算上也很昂贵(并且我有一个每个约1.5GB的PCAP列表),因为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(...)
函数不能作为附加函数使用)?
答案 0 :(得分:0)
我(至少显然)以这种方式解决了:
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()