python3使用libpcap庫進行抓包及數據處理

来源:https://www.cnblogs.com/MikeZhang/archive/2022/10/29/pythonUseLibpcap20221029.html
-Advertisement-
Play Games

python版本:python 3.9 libpcap版本:1.11.0b7 python libpcap庫是底層綁定c語言libpcap庫的開發包,旨在提供python應用可訪問的unix c libpcap庫API(以及為win32系統提供的Npcap、WinPcap),直接使用底層c代碼,性能 ...


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類型;

示例代碼及運行效果:

完整代碼獲取途徑:

關註微信公眾號(聊聊博文,文末可掃碼)後回覆 202210290101 獲取。

3.2、離線數據解析

可以使用libpcap庫進行離線抓包文件的解析,這裡進行簡單的示例: 1)首先需要使用open_offline函數打開pcap文件,需要註意的是,函數的第一個參數必須是byte類型; 2)使用pkthdr函數創建header,獲取包頭信息(時間戳、包大小)​; 3)使用next函數迴圈讀取數據包,需要註意的是,獲取的packet對象的contents是C語言類型,需要使用它ctypes的pointer函數進行轉換​; 4)數據包(比如IP頭)的解析可使用struct的unpack函數​;   示例代碼及運行效果:

完整代碼獲取途徑:

關註微信公眾號(聊聊博文,文末可掃碼)後回覆 202210290102 獲取。   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

 

示例代碼及運行效果:

完整代碼獲取途徑:

關註微信公眾號(聊聊博文,文末可掃碼)後回覆 202210290103 獲取。

三、資源下載

本文涉及libpcap源代碼及whl文件,可從百度網盤獲取: https://pan.baidu.com/s/1E-7xgKqcBDfKwMDIs8XvDQ 關註微信公眾號(聊聊博文,文末可掃碼)後回覆 2022102901 獲取。 微信公眾號:

  • E-Mail : [email protected]
  • 轉載請註明出處,謝謝!
    您的分享是我們最大的動力!

    -Advertisement-
    Play Games
    更多相關文章
    • 根據MSDN的介紹,自己對一些基本結構做一些翻譯,幫助自己理解。 驅動對象 DRIVER_OBJECT typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; ULONG Flags ...
    • Attack Lab 參考手冊 一共六個文件 cookie.txt 一個8位16進位數,作為攻擊的特殊標誌符 farm.c 在ROP攻擊中作為gadgets的產生源 ctarget 代碼註入攻擊的目標文件 rtarget ROP攻擊的目標文件 hex2row 將16進位數轉化為攻擊字元,因為有些字元 ...
    • 沁恆最近推出的低價CH32V003系列, 基於青稞RISC-V2A內核, 48MHz主頻, 2KB SRAM, 16KB Flash, 工作電壓相容3.3V和5V. Win10下的開發環境是比較簡單的, 軟體就是MounRiver, 版本v1.82, 軟體集成了代碼編輯, 編譯環境和燒錄工具. 直接... ...
    • 好家伙,又到了修bug的環節,(深嘆一口氣) 好了,來看報錯 2022-10-29 23:27:52.155 WARN 15068 [nio-8011-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1364, SQLState ...
    • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:CarbonData是一種新型的Apache Hadoop本地文件格式,使用先進的列式存儲、索引、壓縮和編碼技術,以提 ...
    • ①表級鎖:全局鎖,元數據鎖,意向鎖,AUTO-INC鎖 ②行級鎖:兩階段鎖協議,間隙鎖,臨鍵鎖 ③事務隔離級別,ACID特性 ④死鎖:解決方案 ...
    • 大家好,我是陶朱公Boy. 今天跟大家分享一款基於“生產者消費者模式”下實現的組件。 該組件是作者偶然在翻閱公司一中間件源碼的時候碰到的,覺得設計的非常精美、巧妙,花了點時間整理成文分享給大家。 ...
    • 2022-10-29 一、web中的兩個介面: (1)ServletConfig: 說明:每當有一個servlet對象時,就會有唯一 一個servletConfig配置文件對象 功能:能獲得Servlet名稱(該名稱是web.xml中配置的servlet-name的值),使用方法:如下,可寫在 創建 ...
    一周排行
      -Advertisement-
      Play Games
    • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
    • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
    • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
    • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
    • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
    • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
    • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
    • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
    • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
    • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...