真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

今天小編給大家分享一下python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

為環(huán)縣等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及環(huán)縣網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、環(huán)縣網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

python版本:python 3.9

libpcap版本:1.11.0b7

python libpcap庫是底層綁定c語言libpcap庫的開發(fā)包,旨在提供python應(yīng)用可訪問的unix c libpcap庫API(以及為win32系統(tǒng)提供的Npcap、WinPcap),直接使用底層c代碼,性能很好。

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

一、安裝libpcap庫

1、在線安裝

直接使用pip進(jìn)行安裝:

pip install libpcap

默認(rèn)安裝最新版本。

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

2、離線安裝

2.1 下載離線安裝文件

可以在pypi頁面源代碼或whl文件。

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

2.2 執(zhí)行離線安裝操作

1) 可以使用源碼進(jìn)行安裝

解壓文件到當(dāng)前目錄,然后執(zhí)行安裝命令:

python -m pip install ./libpcap-1.11.0b7

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

2)也可以使用whl文件進(jìn)行離線安裝

安裝命令如下:

python -m pip install libpcap-1.11.0b7-py3-none-any.whl

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

二、使用libpcap庫

1、導(dǎo)入及指定pcap庫

import libpcap
libpcap.config(LIBPCAP="wpcap")

2、常用API介紹

tcpdump就是以libpcap為基礎(chǔ)實現(xiàn)的,c語言libpcap的文檔可以在tcpdump官網(wǎng)找

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

這里描述下python常用接口。

2.1 獲取網(wǎng)絡(luò)設(shè)備接口
  • lookupdev(errbuf)

功能:該函數(shù)用于查找網(wǎng)絡(luò)設(shè)備,返回的值可以被open_live函數(shù)直接調(diào)用。

參數(shù):

errbuf為c語言字符串類型,用于獲取錯誤信息。

使用示例:

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)體指針,用于存儲查找到的所有網(wǎng)絡(luò)設(shè)備信息。

errbuf為c語言字符串類型,用于獲取錯誤信息。

使用示例:

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ù)用于打開一個用于捕獲數(shù)據(jù)的網(wǎng)絡(luò)設(shè)備

參數(shù):

device為網(wǎng)絡(luò)接口的名字,可通過api獲取,也可以人為指定,如:"eth0"

snaplen是捕獲數(shù)據(jù)包的長度,不能大于65535

promise用于標(biāo)記是否開啟混雜模式,1代表混雜模式,其它值代表非混雜模式

to_ms代表需要等待的毫秒數(shù),超過這個時間后,獲得數(shù)據(jù)包的函數(shù)會立即返回,0表示一直等待直到有數(shù)據(jù)包到來

errbuf為c語言字符串類型,用于獲取錯誤信息。

返回值:返回pcap_t類型指針,后面的所有操作都要使用這個指針。

使用示例:

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ù)用于打開離線抓包文件

參數(shù):

fname為文件名稱,比如:b"/tmp/test1.cap"

errbuf為c語言字符串類型,用于獲取錯誤信息。

返回值:返回pcap_t類型指針,后面的所有操作都要使用這個指針。

使用示例:

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ù)包,一次只獲取一個包。

參數(shù):

handle為pcap_t類型指針

pheader為pcap_pkthdr結(jié)構(gòu)體指針,可通過pkthdr函數(shù)創(chuàng)建

返回值:返回u_char類型指針,代表包數(shù)據(jù),可使用struct.unpack函數(shù)解析

使用示例:

import libpcap as pcap
pheader = pcap.pkthdr()
packet = pcap.next(handle,pheader)

2.4 寫文件接口
  • dump_open(handle,fname:bytes)

功能:該函數(shù)用于打開文件,存儲獲取到的數(shù)據(jù)包。

參數(shù):

handle為pcap_t類型指針

fname為文件名稱

返回值:返回pcap_dumper_t 類型指針,后面的所有操作都要使用這個指針。

使用示例:

import libpcap as pcap

fname = b"realtime1.cap"
fPcap = pcap.dump_open(handle,fname)

  • dump(handle,pheader,packet)

功能:該函數(shù)用于存儲獲取到的數(shù)據(jù)包。

參數(shù):

handle為pcap_dumper_t類型指針

pheader為pcap_pkthdr結(jié)構(gòu)體指針

packet是數(shù)據(jù)包

返回值:無返回值

使用示例:

fPcapUbyte = ct.cast(fPcap,ct.POINTER(ct.c_ubyte))
pcap.dump(fPcapUbyte,pheader,packet)

  • dump_flush(handle)

功能:該函數(shù)用于將緩存的數(shù)據(jù)刷到磁盤

參數(shù):

handle為pcap_dumper_t類型指針

返回值:錯誤碼,0代表成功,-1代表出錯

2.5 資源釋放接口
  • close(handle)

功能:釋放pcap_t類型指針

參數(shù):

handle為pcap_t類型指針

返回值:無返回值

  • dump_close(handle)

功能:釋放pcap_dumper_t類型指針

參數(shù):

handle為pcap_dumper_t類型指針

返回值:無返回值

3、典型使用場景

3.1、網(wǎng)卡實時抓包

可以使用libpcap庫進(jìn)行網(wǎng)卡實時數(shù)據(jù)抓包,這里進(jìn)行簡單的示例:

1)首先需要獲取或指定抓包設(shè)備

方法1 :指定網(wǎng)卡接口名稱

device = b'\Device\NPF_{BFDBF91E-9848-417D-B8AB-D3ED19990717}' # windows

device = b'eth0' # linux

Windows網(wǎng)卡接口名稱可在wireshark的捕獲界面看到,具體如下:

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

linux網(wǎng)卡名稱獲取:ifconfig

方法2 :使用lookupdev獲取網(wǎng)卡接口名稱

device = pcap.lookupdev(errbuf)

方法3 :使用findalldevs獲取網(wǎ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,獲取包頭信息(時間戳、包大?。?;

4)使用next函數(shù)循環(huán)讀取數(shù)據(jù)包,需要注意的是,獲取的packet對象的contents是C語言類型,需要使用它ctypes的pointer函數(shù)進(jìn)行轉(zhuǎn)換;

5)數(shù)據(jù)包(比如IP頭)的解析可使用struct的unpack函數(shù);

6)如果要將抓包數(shù)據(jù)存盤,可使用dump_open、dump、dump_flush系列函數(shù)進(jìn)行操作,需要注意的是,dump_open函數(shù)的第二個參數(shù)必須是byte類型;

示例代碼及運行效果:

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

3.2、離線數(shù)據(jù)解析

可以使用libpcap庫進(jìn)行離線抓包文件的解析,這里進(jìn)行簡單的示例:

1)首先需要使用open_offline函數(shù)打開pcap文件,需要注意的是,函數(shù)的第一個參數(shù)必須是byte類型;

2)使用pkthdr函數(shù)創(chuàng)建header,獲取包頭信息(時間戳、包大?。?;

3)使用next函數(shù)循環(huán)讀取數(shù)據(jù)包,需要注意的是,獲取的packet對象的contents是C語言類型,需要使用它ctypes的pointer函數(shù)進(jìn)行轉(zhuǎn)換;

4)數(shù)據(jù)包(比如IP頭)的解析可使用struct的unpack函數(shù);

示例代碼及運行效果:

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

3.3、使用過濾條件抓包

網(wǎng)卡實時抓包和離線數(shù)據(jù)解析時,可以設(shè)置過濾條件,避免數(shù)據(jù)量過大。

過濾條件示例:

1) 過濾IP

  • host 過濾某個ip的所有包

host 8.8.8.8

  • src 過濾源ip

src 8.8.8.8

  • dst過濾目的ip

dst 8.8.8.8

2)過濾端口

  • port進(jìn)行單個端口過濾

port 22

  • portange進(jìn)行多個端口過濾

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

示例代碼及運行效果:

python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理

以上就是“python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享文章:python如何使用libpcap庫進(jìn)行抓包及數(shù)據(jù)處理
當(dāng)前路徑:http://weahome.cn/article/jcchhe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部