Python 从数据包ISO/OSI层筛选PCAP文件
我需要将一个PCAP文件拆分为两个不同的文件:第一个文件应包括(且仅限于)指向ISO/OSI模型应用层的所有数据包,而第二个文件包括所有其他数据包 我正在使用Scapy应用过滤器:Python 从数据包ISO/OSI层筛选PCAP文件,python,pcap,scapy,application-layer,Python,Pcap,Scapy,Application Layer,我需要将一个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(appla
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
+lowlayerfilename
(文件大小)的总和与infle
的文件大小不同(更低)
由于infle
被解析了两次,因此报告的方法在计算上也很昂贵(我得到了一个约1.5GB的PCAP列表)
我更喜欢应用不同的过滤器,一次解析输入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的大小
是否存在类似于wrpcap(…)
函数的append\u-to\u-pcap(filename,packet)
函数不作为append使用?我(至少表面上)是这样解决的:
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()