python dpkt模組快速解析pcap

2021-09-13 10:08:24 字數 2377 閱讀 1228

# -*- coding: utf-8 -*-

import dpkt

import collections #有序字典需要的模組

import time

defmain

(file_path)

: f =

open

(file_path)

#此寫法為python2之下,

# f = open(file_path,mode='rb') #python3

try:

pcap = dpkt.pcap.reader(f)

#先按.pcap格式解析,若解析不了,則按pcapng格式解析

except

:# print "it is not pcap ... format, pcapng format..."

pcap = dpkt.pcapng.reader(f)

#解析pcapng會失敗,建議使用scapy庫的rdpcap去解析

#接下來就可以對pcap做進一步解析了,記住在使用結束後最好使用f.close()關掉開啟的檔案,雖然程式執行結束後,

#系統會自己關掉,但是養成好習慣是必不可少的。當前變數pcap中是按照「間戳:單包」的格式儲存著各個單包

####接著上面**########

#將時間戳和包資料分開,一層一層解析,其中ts是時間戳,buf存放對應的包

all_pcap_data=collections.ordereddict(

)#有序字典

all_pcap_data_hex=collections.ordereddict(

)#有序字典,存十六進製制形式

for(ts,buf)

in pcap:

try:

eth = dpkt.ethernet.ethernet(buf)

#解包,物理層

ifnot

isinstance

(eth.data, dpkt.ip.ip)

:#解包,網路層,判斷網路層是否存在,

continue

ip = eth.data

ifnotisinstance

(ip.data, dpkt.tcp.tcp)

:#解包,判斷傳輸層協議是否是tcp,即當你只需要tcp時,可用來過濾

continue

# if not isinstance(ip.data, dpkt.udp.udp):#解包,判斷傳輸層協議是否是udp

# continue

transf_data = ip.data #傳輸層負載資料,基本上分析流量的人都是分析這部分資料,即應用層負載流量

ifnot

len(transf_data.data)

:#如果應用層負載長度為0,即該包為單純的tcp包,沒有負載,則丟棄

continue

all_pcap_data[ts]

=transf_data.data #將時間戳與應用層負載按字典形式有序放入字典中,方便後續分析.

all_pcap_data_hex[ts]

=transf_data.data.encode(

'hex'

)except exception,err:

print

"[error] %s"

% err

f.close(

)#驗證結果,列印儲存的資料報的抓包以及對應的包的應用層負載長度

test_ts=0)

:print time.strftime(

"%y-%m-%d %h:%m:%s"

,time.localtime(ts)),

":",

len#將時間戳轉換成日期

test_ts=ts

#列印最後乙個包的十六進製制形式,因為加密資料在命令列列印會出現大量亂碼和錯行,故在此不做演示列印包的字元形式

print

"\n最後乙個包負載的十六進製制******\n%s"

%all_pcap_data_hex[test_ts]

,"\n"

if __name__ ==

'__main__'

: file_path=

"./test.pcap"

main(file_path)

結果如下圖

dpkt官方文件

kafka Controller模組 詳細解讀

目錄 集群元資料 controllercontext controllerstats shuttingdownbrokerids epoch epochzkversion livebrokers livebrokerepochs alltopics partitionassignments part...

linux驅動模組Makefile解

以下是乙個經典的編譯乙個linux裝置驅動的makefile 此makefile可以完成對大部分驅動的編譯,使用時只需要稍加修改就可以了。warning kernelrelease kernelrelease ifeq kernelrelease kerneldir home linux linux...

iOS runtime快速歸解檔

在開發中 通常會運用到一些全域性的單例 儲存使用者的基本資訊或者一些基本狀態 這個時候可能會運用到單例來儲存資訊 保證全域性獲取到的都是最新的相同的資訊.並且,一般全域性單例的屬性較多 比如包括了使用者的姓名,手機號,性別,城市,年齡等等眾多資訊.如果對該單例的各項屬性進行歸檔,那麼得讓此單例遵循協...