ホームページ  >  記事  >  バックエンド開発  >  Python でのパケット キャプチャとデータ処理に libpcap ライブラリを使用する方法

Python でのパケット キャプチャとデータ処理に libpcap ライブラリを使用する方法

WBOY
WBOY転載
2022-11-01 14:10:135242ブラウズ

この記事では、Python に関する関連知識を提供します。主に、libpcap のインストールや libpcap ライブラリの使用など、パケット キャプチャとデータ処理に libpcap ライブラリを使用する方法を紹介します。以下の内容が皆様のお役に立てれば幸いです。

#【関連する推奨事項:

Python3 ビデオ チュートリアル

Python バージョン: Python 3.9

libpcap バージョン: 1.11.0b7

Python libpcap ライブラリは、基礎となる C 言語 libpcap ライブラリをバインドする開発パッケージです。これは、UNIX C libpcap ライブラリ API にアクセスできるように設計されています。 Python アプリケーション (および win32 システム用に提供される Npcap および WinPcap) は、基盤となる C コードを直接使用し、非常に優れたパフォーマンスを発揮します。

ここでは、Windows 10 環境下で python3.9 に libpcap ライブラリをインストールして使用する方法を記録します (Linux および Mac システムについては、Windows を参照してください)。

pypi アドレス: https://pypi.org/project/libpcap/

github アドレス: https://github.com/karpierz/libpcap

#1. 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

2. libpcap ライブラリを使用します

1. pcap ライブラリをインポートして指定します

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

2. 一般的に使用される API の紹介

tcpdump は libpcap に基づいて実装されています。C 言語 libpcap のドキュメントは、tcpdump 公式 Web サイトにあります。 ##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)

# #機能: この機能は、一度に 1 パケットのみデータ パケットを取得するために使用されます。
  • パラメータ:

    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

    ポート 80 || 22

    サンプル コードと実行効果:

    ##[関連する推奨事項:

    Python3 ビデオ チュートリアル ]

以上がPython でのパケット キャプチャとデータ処理に libpcap ライブラリを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。