在上一節,我們完成了編寫一個簡易的Sniffer的第一步——資料捕獲。
很多時候,我們需要將捕獲的資料先儲存到磁碟上,之後再使用工具或者自己編寫程式碼來進行詳細分析。
本節我們在上一節的基礎上來講解儲存捕獲資料的方式,當然使用tcpdump或者WireShark都可以
很方便的儲存資料包。
4.2.1 使用pcapy儲存和讀取資料
前文我們使用 pcapy的open_live方法,可以獲取pcapy的一個例項物件,通過該物件的dump_open
方法可以獲取一個dump物件,通過dump物件可以儲存資料包到本地磁碟。示例如下:
#!/usr/bin/python
import pcapy
dev = "eth0"
filter = "tcp and port 80"
def save_packet(hdr, data):
dumper.dump(hdr, data)
pcap = pcapy.open_live(dev, 1500, 0, 100)
dumper = pcap.dump_open(`sniffer.pcap`)
pcap.setfilter(filter)
pcap.loop(0, save_packet)複製程式碼
上面的程式碼中,我們首先通過dump_open方法獲取dumper物件,隨後在迴圈捕獲資料的時候
呼叫save_packet方法,該方法中呼叫dump方法將資料儲存到本地。執行結果如下:
下面我們看看如何從磁碟讀取pcap檔案。
#!/usr/bin/python
import pcapy
dev = "eth0"
filter = "tcp and port 80"
def read_packet(hdr, data):
print data
pcap = pcapy.open_offline(`sniffer.pcap`)
pcap.loop(0, read_packet)複製程式碼
在上面的帶碼中,我們使用pcapy的open_offline方法從本地開啟一個pcap檔案,之後就可以
迴圈處理每一個資料包了。執行結果如下:
4.2.2 使用Scapy儲存和讀取資料
上一節我們講了Scapy的基礎用法,Scapy支援將捕獲的資料儲存成多種資料格式,比如hex,base64等,
利用Scapy來儲存捕獲的資料到pcap檔案,有兩種方式,第一種為使用PcapWriter模組,例如:
from scapy.all import *
from scapy.utils import PcapWriter
def packetHandler(pkt):
pktdump.write(pkt)
pktdump = PcapWriter("ssss.pcap", append=True, sync=True)
sniff(filter=`tcp and port 80`,prn=packetHandler,iface=`eth0`)複製程式碼
初始化PcapWriter物件需要傳入三個引數,要儲存的檔名、是否追加資料,是否同步順序新增。
之後在packetHandler方法中,呼叫write方法將資料包寫入檔案。執行結果如下:
另外一種方式為配置sniff方法的offline引數。例如:
sniff(filter=`tcp and port 80`,iface=`eth0`,offline="temp.cap")複製程式碼
讀取pcap檔案可以使用scapy.all 模組中的rdpcap方法。例如:
from scapy.all import *
packets = rdpcap(`ssss.pcap`)
for packet in packets:
print packet複製程式碼
如上,rdpcap方法接收一個檔案路徑引數,返回所有的資料包。執行結果如下:
4.2.3 小結
讀取和儲存資料的方法很多,這裡結合本教程例項,只介紹這兩種較為簡單的方法。
檢視更多Python黑客程式設計及安全類文章,請關注玄魂工作室微信訂閱號(xuanhun521)。