从数据包ISO / OSI层过滤PCAP文件

时间:2012-12-21 11:02:57

标签: python pcap scapy application-layer

我需要将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(...)函数不能作为附加函数使用)?

1 个答案:

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