2012-12-21 61 views
0

我需要將PCAP文件分成兩個不同的文件:第一個應該包括所有(且僅限於)指向ISO/OSI模型應用層的數據包,而第二個包括所有其他的。從數據包ISO/OSI層過濾PCAP文件

我使用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的和是不同的(低)。

由於infile被解析了兩次,所報告的方法在計算上也很昂貴(並且我得到了每個約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的大小太多的內存...

append_to_pcap(filename, packet) like函數是否存在(wrpcap(...)函數不起作用)?

回答

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