Python 黑帽編程 4.2 Sniffer之數據本地存儲和加載


在上一節,我們完成了編寫一個簡易的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)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM