PyShark入門(2):FileCapture和LiveCapture模塊

原文地址:http://zodiacg.net/2016/07/in...python

本系列文章譯自thePacketGeek的系列文章。原創翻譯,轉載請註明出處。網絡

PyShark中進行數據包分析的兩個典型方法是使用 FileCaptureLiveCapture 模塊。
前者從一個存儲的捕獲文件中導入u數據包,後者將使用本機的網絡接口進行嗅探。
使用這兩個模塊都會返回一個 capture 對象。以後的文章中會詳細介紹。
咱們首先來了解一下這兩個模塊如何使用。tcp

兩個模塊提供類似的參數來控制 capture 對象中返回的數據包。下面的定義直接從模塊的docstring中獲取:函數

  • __interface__: [僅用於LiveCapture] 進行嗅探的網絡接口。若是沒有給出,使用可用的第一個接口。加密

  • __bpf_filter__: [僅用於LiveCapture] 在嗅探時使用的BPF(tcpdump)過濾條件。.net

  • __input_file__: [僅用於FileCapture] 保存的捕獲文件的路徑(PCAP, PCAPNG格式)。翻譯

  • __keep_packets__: 設定在調用next()函數以後是否保留以前讀取的數據包。用於在讀取較大的捕獲時節省內存。code

  • __display_filter__: 設定在讀取捕獲時使用的display過濾條件(即Wireshark過濾器)。對象

  • __only_summaries__: 僅產生數據包摘要,比正常讀取速度快的多,但包含信息不多。dns

  • __decryption_key__: 可選的用於加密解密捕獲的流量的密鑰。

  • __encryption_type__: 捕獲的數據流量所使用的加密標準(必須是WEP,WPA-PWD或WPA-PWK中之一,默認是WPA-PWK)。

only_summaries選項

使用 only_summaries 後,返回的 capture 對象中的數據包將只包含摘要信息,相似於tshark的默認輸出:

>>> cap = pyshark.FileCapture('test.pcap', only_summaries=True)
>>> print cap[0]
2 0.512323 0.512323 fe80::f141:48a9:9a2c:73e5 ff02::c SSDP 208 M-SEARCH * HTTP/

使用這個選項,讀取捕獲文件將變得很快,但每一個數據包將只包含下面的這些屬性。若是你想獲取嗅探中的IP地址來構建會話列表,或者使用時間和包長度來計算帶寬的統計數據,那麼這些信息也足夠了。

>>> pkt.     #(tab auto-complete)
pkt.delta         pkt.info          pkt.no            pkt.stream        pkt.window
pkt.destination   pkt.ip id         pkt.protocol      pkt.summary_line
pkt.host          pkt.length        pkt.source        pkt.time

keep_packets選項

PyShark只會在要對數據包進行處理的時候纔會將其讀入內存。在你處理數據包的過程當中,PyShark會將每一個數據包添加到 capture 對象中叫 _packet 的列表屬性的末尾。當處理大量的數據包時,這個列表將佔用大量的內存,所以PyShark提供了這個選項使得內存中一次僅保留一個數據包。若是 keep_packets 設置爲False(默認爲True),PyShark在讀取新數據包時會將上一個從內存中清除。我發現這樣能提高一點數據包遍歷處理的速度,提高一點也是好的!

display_filter和bpf_filter

這些過濾器有助於使你的應用集中精力於你想要分析的內容上。相似於使用Wireshark或者tshark進行嗅探,BPF過濾器能夠用於肯定進入到返回的 capture 對象中的流量。
BPF過濾器的靈活性不如Wireshark的display過濾器,可是你仍能夠創造性的使用這些有限的關鍵字和偏移過濾器。
若是須要對使用BPF過濾器更詳細的說明,參考Wireshark的官方文檔
下面是一個使用BPF過濾器嗅探目標HTTP流量的例子:

>>> cap = pyshark.LiveCapture(interface='en0', bpf_filter='ip and tcp port 80')
>>> cap.sniff(timeout=5)
>>> cap
   <LiveCapture (21 packets)>
>>> print cap[5].highest_layer
HTTP

在讀取保存的捕獲文件時,你能夠經過設置 display_filter 選項,利用Wireshark強大的解析器來限制返回的數據包。
下面是沒有使用過濾器的狀況下,個人test.pcap文件中的前幾個數據包:

>>> cap = pyshark.FileCapture('test.pcap')
>>> for pkt in cap:
...:    print pkt.highest_layer
...:
HTTP
HTTP
HTTP
TCP
HTTP
... (truncated)

使用了display過濾器來限制只顯示DNS數據流量:

>>> cap = pyshark.FileCapture('test.pcap', display_filter="dns")
>>> for pkt in cap:
...:    print pkt.highest_layer
...:
DNS
DNS
DNS
DNS
DNS
... (truncated)

針對LiveCapture的附加說明

在遍歷 LiveCapture 返回的 capture 對象時我發現了一個奇怪的現象。彷佛當你試圖遍歷數據包列表時,它會從頭開始進行嗅探,而後實時的進行遍歷(來一個數據包就進行一次遍歷)。我目前沒有發現可以存儲下數據包的方法, LiveCapture 僅能用於實時處理數據包。


上一篇:PyShark入門(1):簡介
下一篇:PyShark入門(3):capture對象

相關文章
相關標籤/搜索