python3使用libpcap庫(kù)進(jìn)行抓包及數(shù)據(jù)處理的操作方法
python版本:python 3.9
libpcap版本:1.11.0b7
python libpcap庫(kù)是底層綁定c語(yǔ)言libpcap庫(kù)的開(kāi)發(fā)包,旨在提供python應(yīng)用可訪問(wèn)的unix c libpcap庫(kù)API(以及為win32系統(tǒng)提供的Npcap、WinPcap),直接使用底層c代碼,性能很好。
這里記錄下Windows 10 環(huán)境下python3.9如何安裝及使用libpcap庫(kù)(Linux和mac系統(tǒng)可參考Windows)。
pypi地址:https://pypi.org/project/libpcap/
github 地址:https://github.com/karpierz/libpcap
一、安裝libpcap庫(kù)
1、在線(xiàn)安裝
直接使用pip進(jìn)行安裝:
pip install libpcap
默認(rèn)安裝最新版本。
2、離線(xiàn)安裝
2.1 下載離線(xiàn)安裝文件
可以在pypi頁(yè)面源代碼或whl文件。
2.2 執(zhí)行離線(xiàn)安裝操作
1) 可以使用源碼進(jìn)行安裝
解壓文件到當(dāng)前目錄,然后執(zhí)行安裝命令:
python -m pip install ./libpcap-1.11.0b7
2)也可以使用whl文件進(jìn)行離線(xiàn)安裝
安裝命令如下:
python -m pip install libpcap-1.11.0b7-py3-none-any.whl
二、使用libpcap庫(kù)
1、導(dǎo)入及指定pcap庫(kù)
import libpcap libpcap.config(LIBPCAP="wpcap")
2、常用API介紹
tcpdump就是以libpcap為基礎(chǔ)實(shí)現(xiàn)的,c語(yǔ)言libpcap的文檔可以在tcpdump官網(wǎng)找的:
https://www.tcpdump.org/manpages/pcap.3pcap.html
這里描述下python常用接口。
2.1 獲取網(wǎng)絡(luò)設(shè)備接口
lookupdev(errbuf)
功能:該函數(shù)用于查找網(wǎng)絡(luò)設(shè)備,返回的值可以被open_live函數(shù)直接調(diào)用。
參數(shù):
errbuf為c語(yǔ)言字符串類(lèi)型,用于獲取錯(cuò)誤信息。
使用示例:
import ctypes as ct import libpcap as pcap errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1) device = pcap.lookupdev(errbuf) print(errbuf.value)
findalldevs(alldevs, errbuf)
功能:該函數(shù)用于查找所有網(wǎng)絡(luò)設(shè)備。
參數(shù):
alldevs為pcap_if_t結(jié)構(gòu)體指針,用于存儲(chǔ)查找到的所有網(wǎng)絡(luò)設(shè)備信息。
errbuf為c語(yǔ)言字符串類(lèi)型,用于獲取錯(cuò)誤信息。
使用示例:
import ctypes as ct import libpcap as pcap errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1) alldevs = ct.POINTER(pcap.pcap_if_t)() pcap.findalldevs(ct.byref(alldevs), errbuf) print(alldevs[0].name) pcap.freealldevs(alldevs)
2.2 抓包接口
open_live(device:bytes,snaplen:int,promisc:int,to_ms:int,errbuf)
功能:該函數(shù)用于打開(kāi)一個(gè)用于捕獲數(shù)據(jù)的網(wǎng)絡(luò)設(shè)備
參數(shù):
device為網(wǎng)絡(luò)接口的名字,可通過(guò)api獲取,也可以人為指定,如:"eth0"
snaplen是捕獲數(shù)據(jù)包的長(zhǎng)度,不能大于65535
promise用于標(biāo)記是否開(kāi)啟混雜模式,1代表混雜模式,其它值代表非混雜模式
to_ms代表需要等待的毫秒數(shù),超過(guò)這個(gè)時(shí)間后,獲得數(shù)據(jù)包的函數(shù)會(huì)立即返回,0表示一直等待直到有數(shù)據(jù)包到來(lái)
errbuf為c語(yǔ)言字符串類(lèi)型,用于獲取錯(cuò)誤信息。
返回值:返回pcap_t類(lèi)型指針,后面的所有操作都要使用這個(gè)指針。
使用示例:
import ctypes as ct import libpcap as pcap device = b'eth0' # linux errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1) handle = pcap.open_live(device,4096,1,1000,errbuf) if errbuf.value: print("hanle error :",errbuf.value)
open_offline(fname:bytes,errbuf)
功能:該函數(shù)用于打開(kāi)離線(xiàn)抓包文件
參數(shù):
fname為文件名稱(chēng),比如:b"/tmp/test1.cap"
errbuf為c語(yǔ)言字符串類(lèi)型,用于獲取錯(cuò)誤信息。
返回值:返回pcap_t類(lèi)型指針,后面的所有操作都要使用這個(gè)指針。
使用示例:
import ctypes as ct import libpcap as pcap errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1) handle = pcap.open_offline(fname,errbuf) if errbuf.value: print("hanle error :",errbuf.value)
2.3 數(shù)據(jù)包獲取接口
next(handle,pheader)
功能:該函數(shù)用于獲取數(shù)據(jù)包,一次只獲取一個(gè)包。
參數(shù):
handle為pcap_t類(lèi)型指針
pheader為pcap_pkthdr結(jié)構(gòu)體指針,可通過(guò)pkthdr函數(shù)創(chuàng)建
返回值:返回u_char類(lèi)型指針,代表包數(shù)據(jù),可使用struct.unpack函數(shù)解析
使用示例:
import libpcap as pcap pheader = pcap.pkthdr() packet = pcap.next(handle,pheader)
2.4 寫(xiě)文件接口
dump_open(handle,fname:bytes)
功能:該函數(shù)用于打開(kāi)文件,存儲(chǔ)獲取到的數(shù)據(jù)包。
參數(shù):
handle為pcap_t類(lèi)型指針
fname為文件名稱(chēng)
返回值:返回pcap_dumper_t 類(lèi)型指針,后面的所有操作都要使用這個(gè)指針。
使用示例:
import libpcap as pcap fname = b"realtime1.cap" fPcap = pcap.dump_open(handle,fname)
dump(handle,pheader,packet)
功能:該函數(shù)用于存儲(chǔ)獲取到的數(shù)據(jù)包。
參數(shù):
handle為pcap_dumper_t類(lèi)型指針
pheader為pcap_pkthdr結(jié)構(gòu)體指針
packet是數(shù)據(jù)包
返回值:無(wú)返回值
使用示例:
fPcapUbyte = ct.cast(fPcap,ct.POINTER(ct.c_ubyte)) pcap.dump(fPcapUbyte,pheader,packet)
dump_flush(handle)
功能:該函數(shù)用于將緩存的數(shù)據(jù)刷到磁盤(pán)
參數(shù):
handle為pcap_dumper_t類(lèi)型指針
返回值:錯(cuò)誤碼,0代表成功,-1代表出錯(cuò)
2.5 資源釋放接口
close(handle)
功能:釋放pcap_t類(lèi)型指針
參數(shù):
handle為pcap_t類(lèi)型指針
返回值:無(wú)返回值
dump_close(handle)
功能:釋放pcap_dumper_t類(lèi)型指針
參數(shù):
handle為pcap_dumper_t類(lèi)型指針
返回值:無(wú)返回值
3、典型使用場(chǎng)景
3.1、網(wǎng)卡實(shí)時(shí)抓包
可以使用libpcap庫(kù)進(jìn)行網(wǎng)卡實(shí)時(shí)數(shù)據(jù)抓包,這里進(jìn)行簡(jiǎn)單的示例:
1)首先需要獲取或指定抓包設(shè)備
方法1 :指定網(wǎng)卡接口名稱(chēng)
device = b'\Device\NPF_{BFDBF91E-9848-417D-B8AB-D3ED19990717}' # windows
device = b'eth0' # linux
Windows網(wǎng)卡接口名稱(chēng)可在wireshark的捕獲界面看到,具體如下:
linux網(wǎng)卡名稱(chēng)獲?。篿fconfig
方法2 :使用lookupdev獲取網(wǎng)卡接口名稱(chēng)
device = pcap.lookupdev(errbuf)
方法3 :使用findalldevs獲取網(wǎng)卡接口名稱(chēng)
alldevs = ct.POINTER(pcap.pcap_if_t)()
pcap.findalldevs(ct.byref(alldevs), errbuf)
device =alldevs[0].name
2)使用open_live函數(shù)進(jìn)行網(wǎng)卡抓包;
3)使用pkthdr函數(shù)創(chuàng)建header,獲取包頭信息(時(shí)間戳、包大?。?;
4)使用next函數(shù)循環(huán)讀取數(shù)據(jù)包,需要注意的是,獲取的packet對(duì)象的contents是C語(yǔ)言類(lèi)型,需要使用它c(diǎn)types的pointer函數(shù)進(jìn)行轉(zhuǎn)換;
5)數(shù)據(jù)包(比如IP頭)的解析可使用struct的unpack函數(shù);
6)如果要將抓包數(shù)據(jù)存盤(pán),可使用dump_open、dump、dump_flush系列函數(shù)進(jìn)行操作,需要注意的是,dump_open函數(shù)的第二個(gè)參數(shù)必須是byte類(lèi)型;
示例代碼及運(yùn)行效果:
完整代碼獲取途徑:
關(guān)注微信公眾號(hào)(聊聊博文,文末可掃碼)后回復(fù)202210290101獲取。
3.2、離線(xiàn)數(shù)據(jù)解析
可以使用libpcap庫(kù)進(jìn)行離線(xiàn)抓包文件的解析,這里進(jìn)行簡(jiǎn)單的示例:
1)首先需要使用open_offline函數(shù)打開(kāi)pcap文件,需要注意的是,函數(shù)的第一個(gè)參數(shù)必須是byte類(lèi)型;
2)使用pkthdr函數(shù)創(chuàng)建header,獲取包頭信息(時(shí)間戳、包大?。?;
3)使用next函數(shù)循環(huán)讀取數(shù)據(jù)包,需要注意的是,獲取的packet對(duì)象的contents是C語(yǔ)言類(lèi)型,需要使用它c(diǎn)types的pointer函數(shù)進(jìn)行轉(zhuǎn)換?;
4)數(shù)據(jù)包(比如IP頭)的解析可使用struct的unpack函數(shù)?;
示例代碼及運(yùn)行效果:
完整代碼獲取途徑:
關(guān)注微信公眾號(hào)(聊聊博文,文末可掃碼)后回復(fù)202210290102獲取。
3.3、使用過(guò)濾條件抓包
網(wǎng)卡實(shí)時(shí)抓包和離線(xiàn)數(shù)據(jù)解析時(shí),可以設(shè)置過(guò)濾條件,避免數(shù)據(jù)量過(guò)大。
過(guò)濾條件示例:
1) 過(guò)濾IP
host 過(guò)濾某個(gè)ip的所有包
host 8.8.8.8
src 過(guò)濾源ip
src 8.8.8.8
dst過(guò)濾目的ip
dst 8.8.8.8
2)過(guò)濾端口
port進(jìn)行單個(gè)端口過(guò)濾
port 22
portange進(jìn)行多個(gè)端口過(guò)濾
portange 1-1024
可使用src或dst指定端口方向
src port 22
dst port 22
3)指定協(xié)議
tcp
udp
icmp
4)使用組合條件
and 進(jìn)行與邏輯
src localhost and dst port 22
src localhost && dst port 22
or 進(jìn)行或邏輯
port 80 or 22
port 80 || 22
示例代碼及運(yùn)行效果:
三、資源下載
本文涉及l(fā)ibpcap源代碼及whl文件,可從百度網(wǎng)盤(pán)獲取:
鏈接: https://pan.baidu.com/s/1u6MtBVUa2aM-C-Xq-EGU3Q?pwd=pwrq
到此這篇關(guān)于python3使用libpcap庫(kù)進(jìn)行抓包及數(shù)據(jù)處理的操作方法的文章就介紹到這了,更多相關(guān)python libpcap庫(kù)抓包數(shù)據(jù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你學(xué)會(huì)Python?Flask框架設(shè)置響應(yīng)頭
本篇博客我們將帶大家全面了解Python中Flask框架關(guān)于請(qǐng)求的相關(guān)設(shè)置的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2023-01-01一篇文章帶你學(xué)習(xí)Python3的高級(jí)特性(2)
這篇文章主要為大家詳細(xì)介紹了Python3的高階函數(shù),主要介紹什么是高級(jí)特性,高級(jí)特性的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01python實(shí)現(xiàn)ID3決策樹(shù)算法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)ID3決策樹(shù)算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12分享五個(gè)超實(shí)用Python腳本,減少垃圾軟件負(fù)擔(dān)
今天給大家?guī)?lái)幾個(gè)實(shí)用的python腳本工具,可以實(shí)現(xiàn)系統(tǒng)提示工具、文件夾清理工具等,這樣就再也不用擔(dān)心女朋友在電腦里安裝垃圾軟件啦2022-05-05Python基礎(chǔ)之標(biāo)準(zhǔn)庫(kù)和常用的第三方庫(kù)案例教程
這篇文章主要介紹了Python基礎(chǔ)之標(biāo)準(zhǔn)庫(kù)和常用的第三方庫(kù)案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07pandas實(shí)現(xiàn)數(shù)據(jù)合并的示例代碼
本文主要介紹了pandas實(shí)現(xiàn)數(shù)據(jù)合并的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05詳解NumPy中的線(xiàn)性關(guān)系與數(shù)據(jù)修剪壓縮
本文將通過(guò)股票均線(xiàn)計(jì)算的案例來(lái)為大家講解一下NumPy中的線(xiàn)性關(guān)系以及數(shù)據(jù)修剪壓縮的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05python爬蟲(chóng)開(kāi)發(fā)之urllib模塊詳細(xì)使用方法與實(shí)例全解
這篇文章主要介紹了python爬蟲(chóng)開(kāi)發(fā)之urllib模塊詳細(xì)使用方法與實(shí)例全解,需要的朋友可以參考下2020-03-03