1. 程式人生 > >使用Scapy分析pcap資料包

使用Scapy分析pcap資料包

網路上首先搜到的是如下用法:

看到 “for pktno in range(len(pkts))”,知道rdpcap是把整個資料包讀入記憶體中。我擔心資料包很大的情況下,效能影響很大。

於是繼續搜,搜到了一篇這樣使用的陷阱。解析如下:

Scapy所在目錄:C:\Python27\Lib\site-packages\scapy

Rdpcap函式在utils.py檔案中的定義:

繼續找PcapReader這個類。同樣在utils.py這個檔案中。繼承自同在這個檔案中定義的RawPcapReader類。

Read_allPcapReader中的定義:


Read_allRawPcapReader

中的定義

可見一個read_all直接把整個的pcap檔案全都載入到記憶體當中了。

而且這裡存在一個陷阱。rdpcap其實就是一行程式碼——return. return時,例項化了PcapReader類,並呼叫了其read_all函式。不難想到——既然rdpcap的作用是讀取一個pcap檔案的內容,那一定會有open操作。我們必然要問一句:既然open了,那麼你是在哪close的呢??



可見,一旦例項化這個類,初始化函式就會自動的將使用者指定的pcap檔案開啟,但用完之後,必須使用者手動close掉才可以。而rdpcap這個函式只例項化了PcapReader這個類,卻沒有close

掉,也沒有將例項化的物件傳遞出來,使用者也無法close

因此,程式碼做如下優化,參照Read_allRawPcapReader中的定義,直接拿出來自己用。

如下,就做到了一包一包的讀。讀完把檔案關閉。

接下來對資料進行分析

按照網上查到的pcap格式,可以獲得資料包的時間戳(符合我的應用)

資料如何分析呢?

嘗試了下通過repr打印出資料包:



面對這樣的資料,不知道如何分析了

於是想知道讀取的資料包是什麼型別的資料:

print type(data)

得到結果:

<class 'scapy.layers.l2.Ether'>

搜素其幫助:


得到如下資訊:

按照如下資訊,試著:print data.src,打印出了源mac地址

同理,試著:print data.load,打印出了udp資料,由此就可以進行資料分析了。