python3使用scapy分析修改pcap大檔案(1G)
阿新 • • 發佈:2019-02-01
對pcap檔案分析比較常用的是C語言進行分析。這裡由於常用python3,所以在網上尋找使用python3來處理這種大pcap包。不過現在網上有的對應教程非常少,而一大部分是用rdpcap來開啟檔案的,這個方法在開啟大檔案是完全行不通的,記憶體完全不夠大,而且執行太慢。最後我找到了使用PcapReader讀檔案返回一個迭代器來解決大檔案佔用太多記憶體的問題。在pcap中資料結構裡處理中也遇到了很多問題。下面我就說一下我的一些總結。【程式碼執行沒問題】
附:如果覺得scapy處理大檔案偏慢,希望能夠更加快速的遍歷pcap檔案,可以看我的這篇部落格:
python3安裝scapy【僅供參考】:
首先匯入包
from scapy.all import *
接下來是讀取pcap檔案:
with PcapReader('input.pcap') as pcap_reader:#返回一個迭代器
for pkt in pcap_reader:#for迴圈進行遍歷
#對pkt進行相應的處理
要對pkt進行處理,首先得知道怎麼訪問自己要訪問的資料,這裡pkt直接列印會是這樣:
這樣的輸出顯然不是我們想要的,這裡採用repr(pkt)返回一個字串【這裡我也不懂哈】,打印出來:
這裡已經可以把一個數據包完整的打印出來了。但如果我們要對資料包進行過濾呢?比如把arp包過濾掉:
if 'ARP' in pkt:
continue
就是這麼簡單,過濾TCP,UDP也是一樣的。如果我們要對源IP,目的IP等進行更改,可以這樣做:
pkt['Ether'].src = '00:00:00:00:00:01'
pkt['Ether'].dst = '00:00:00:00:00:03'
pkt['IP'].src = '10.0.0.1'
pkt['IP'].dst = '10.0.0.3'
前兩個是更改mac地址,後面兩個是更改IP地址,他這裡的索引原理我沒整明白,如果有懂這個的大佬望告知!
最後附上完整程式碼:
#coding=utf-8 from scapy.all import * #import os def change(pkt): pkt['Ether'].src = '00:00:00:00:00:01' pkt['Ether'].dst = '00:00:00:00:00:03' pkt['IP'].src = '10.0.0.1' pkt['IP'].dst = '10.0.0.3' return pkt def write_file():#過濾並進行寫檔案 writers = PcapWriter('udp_from_input.pcap')#被寫的檔案 i=0 with PcapReader('input.pcap') as pcap_reader:#進行讀的檔案 for pkt in pcap_reader: if 'UDP' in pkt: #print(repr(pkt)) pkt = change(pkt) writers.write(pkt=pkt) print(i)#計數用,表示程式還在跑,沒有卡死 i+=1 def read_test(n):#讀函式 i=0 with PcapReader('udp_from_input.pcap') as pcap_reader: for pkt in pcap_reader: print(repr(pkt)) if(i>n): break i+=1 if __name__=='__main__': read_test(4)#這裡是進行讀
希望能夠多多交流!