首頁  >  文章  >  後端開發  >  python使用libpcap函式庫進行抓包及資料處理的操作方法

python使用libpcap函式庫進行抓包及資料處理的操作方法

WBOY
WBOY轉載
2022-11-01 14:10:135334瀏覽

本篇文章為大家帶來了關於Python的相關知識,其中主要介紹了使用libpcap庫進行抓包及數據處理的操作方法,包括了安裝libpcap、使用libpcap庫等等內容,下面一起來看一下,希望對大家有幫助。

【相關推薦:Python3影片教學

python版本:python 3.9

#libpcap版本:1.11.0b7

python libpcap函式庫是底層綁定c語言libpcap函式庫的開發包,設計用來提供python應用程式可存取的unix c libpcap函式庫API(以及win32系統提供的Npcap、WinPcap),直接使用底層c程式碼,效能很好。

這裡記錄下Windows 10 環境下python3.9如何安裝及使用libpcap函式庫(Linux和mac系統可參考Windows)。

pypi網址:https://pypi.org/project/libpcap/

github 網址:https://github.com/karpierz/libpcap

#一、安裝libpcap函式庫

#1、線上安裝

直接使用pip安裝:

pip install libpcap

預設安裝最新版本。

2、離線安裝

#2.1 下載離線安裝檔

可以在pypi頁面原始碼或whl檔。

2.2 執行離線安裝作業

1) 可以使用原始碼進行安裝

解壓縮檔案到目前目錄,然後執行安裝指令:

python -m pip install ./libpcap-1.11.0b7

2)也可以使用whl檔案進行離線安裝

安裝指令如下:

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

二、使用libpcap函式庫

#1、導入及指定pcap函式庫

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

2、常用API介紹

tcpdump就是以libpcap為基礎實現的,c語言libpcap的文檔可以在tcpdump官網找的:

https://www.tcpdump.org/manpages /pcap.3pcap.html

這裡描述下python常用介面。

2.1 取得網路設備介面

  • lookupdev(errbuf)

功能:此函數用於尋找網路設備,傳回的值可以被open_live函數直接呼叫。

參數:

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)

#功能:此函數用於尋找所有網路設備。

參數:

alldevs為pcap_if_t結構體指針,用於儲存查找到的所有網路設備資訊。

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)

功能:此函數用於開啟一個用於擷取資料的網路裝置

參數:

device為網路介面的名字,可透過api獲取,也可以人為指定,如:"eth0"

snaplen是捕獲資料包的長度,不能大於65535

promise用於標記是否開啟混雜模式,1代表混雜模式,其它值代表非混雜模式

to_ms代表需要等待的毫秒數,超過這個時間後,獲得資料包的函數會立即返回,0表示一直等待直到有資料包到來

#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)

功能:此函數用於開啟離線抓包檔案

參數:

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 封包取得介面

  • next(handle,pheader)

#功能:此函數用於取得資料包,一次只取得一個包。

參數:

handle为pcap_t类型指针

pheader为pcap_pkthdr结构体指针,可通过pkthdr函数创建

返回值:返回u_char类型指针,代表包数据,可使用struct.unpack函数解析

使用示例:

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

2.4 写文件接口

  • dump_open(handle,fname:bytes)

功能:该函数用于打开文件,存储获取到的数据包。

参数:

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)

功能:该函数用于存储获取到的数据包。

参数:

handle为pcap_dumper_t类型指针

pheader为pcap_pkthdr结构体指针

packet是数据包

返回值:无返回值

使用示例:

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

功能:该函数用于将缓存的数据刷到磁盘

参数:

handle为pcap_dumper_t类型指针

返回值:错误码,0代表成功,-1代表出错

2.5 资源释放接口

  • close(handle)

功能:释放pcap_t类型指针

参数:

handle为pcap_t类型指针

返回值:无返回值

  • dump_close(handle)

功能:释放pcap_dumper_t类型指针

参数:

handle为pcap_dumper_t类型指针

返回值:无返回值

3、典型使用场景

3.1、网卡实时抓包

可以使用libpcap库进行网卡实时数据抓包,这里进行简单的示例:

1)首先需要获取或指定抓包设备

方法1 :指定网卡接口名称

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

device = b'eth0' # linux

Windows网卡接口名称可在wireshark的捕获界面看到,具体如下:

linux网卡名称获取:ifconfig

方法2 :使用lookupdev获取网卡接口名称

device = pcap.lookupdev(errbuf)

方法3 :使用findalldevs获取网卡接口名称

alldevs = ct.POINTER(pcap.pcap_if_t)()

pcap.findalldevs(ct.byref(alldevs), errbuf)

device =alldevs[0].name

2)使用open_live函数进行网卡抓包;

3)使用pkthdr函数创建header,获取包头信息(时间戳、包大小);

4)使用next函数循环读取数据包,需要注意的是,获取的packet对象的contents是C语言类型,需要使用它ctypes的pointer函数进行转换;

5)数据包(比如IP头)的解析可使用struct的unpack函数;

6)如果要将抓包数据存盘,可使用dump_open、dump、dump_flush系列函数进行操作,需要注意的是,dump_open函数的第二个参数必须是byte类型;

示例代码及运行效果:

3.2、离线数据解析

可以使用libpcap库进行离线抓包文件的解析,这里进行简单的示例:

1)首先需要使用open_offline函数打开pcap文件,需要注意的是,函数的第一个参数必须是byte类型;

2)使用pkthdr函数创建header,获取包头信息(时间戳、包大小);

3)使用next函数循环读取数据包,需要注意的是,获取的packet对象的contents是C语言类型,需要使用它ctypes的pointer函数进行转换;

4)数据包(比如IP头)的解析可使用struct的unpack函数;

示例代码及运行效果:

3.3、使用过滤条件抓包

网卡实时抓包和离线数据解析时,可以设置过滤条件,避免数据量过大。

过滤条件示例:

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进行单个端口过滤

port 22

  • portange进行多个端口过滤

portange 1-1024

  • 可使用src或dst指定端口方向

src port 22

dst port 22

3)指定协议

tcp

udp

icmp

4)使用组合条件

  • and 进行与逻辑

src localhost and dst port 22

src localhost && dst port 22

  • or 进行或逻辑

port 80 or 22

port 80 || 22

範例程式碼及運行效果:

【相關推薦:Python3影片教學

以上是python使用libpcap函式庫進行抓包及資料處理的操作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除