Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie die libpcap-Bibliothek zur Paketerfassung und Datenverarbeitung in Python

So verwenden Sie die libpcap-Bibliothek zur Paketerfassung und Datenverarbeitung in Python

WBOY
WBOYnach vorne
2022-11-01 14:10:135242Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Python. Er stellt hauptsächlich die Verwendung der libpcap-Bibliothek für die Paketerfassung und Datenverarbeitung vor, einschließlich der Installation von libpcap, der Verwendung der libpcap-Bibliothek usw. Schauen wir uns das an. Ich hoffe, es hilft allen.

[Verwandte Empfehlungen: Python3-Video-Tutorial]

Python-Version: Python 3.9

libpcap-Version: 1.11.0b7

Die Python-Libpcap-Bibliothek ist eine Entwicklung Paket für die zugrunde liegende C-Sprachbibliothek libpcap Ziel ist es, die Unix-C-Libpcap-Bibliotheks-API (sowie Npcap und WinPcap für Win32-Systeme) für Python-Anwendungen zugänglich zu machen und dabei den zugrunde liegenden C-Code mit sehr guter Leistung direkt zu verwenden.

Hier wird aufgezeichnet, wie die libpcap-Bibliothek in Python3.9 unter Windows 10 installiert und verwendet wird (für Linux- und Mac-Systeme siehe Windows).

Pypi-Adresse: https://pypi.org/project/libpcap/

Github-Adresse: https://github.com/karpierz/libpcap

1. Installieren Sie die libpcap-Bibliothek

1, Online-Installation

Verwenden Sie pip zur direkten Installation:

pip install libpcap

Die neueste Version wird standardmäßig installiert.

2. Offline-Installation

2.1 Laden Sie die Offline-Installationsdatei herunter

Sie finden den Quellcode oder die WHL-Datei auf der Pypi-Seite. 2.2 Führen Sie die Offline-Installation durch Sie können die WHL-Datei auch für die Offline-Installation verwenden. Der Installationsbefehl lautet wie folgt:

2. Verwenden Sie die libpcap-Bibliothek

1. Importieren Sie die PCAP-Bibliothek und geben Sie sie an

python -m pip install ./libpcap-1.11.0b7

2. Einführung zu gängigen APIs

tcpdump wird basierend auf libpcap implementiert. Die Dokumentation von libpcap in der C-Sprache finden Sie auf der offiziellen Website von tcpdump:

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

Hier finden Sie eine Beschreibung der allgemeinen Schnittstellen von Python.

2.1 Holen Sie sich die Netzwerkgeräteschnittstelle

lookupdev(errbuf)

Funktion: Diese Funktion wird verwendet, um das Netzwerkgerät zu finden, und der zurückgegebene Wert kann direkt von der open_live-Funktion aufgerufen werden.

Parameter:

errbuf ist ein Zeichenfolgentyp in C-Sprache, der zum Abrufen von Fehlerinformationen verwendet wird.

Verwendungsbeispiel:

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

findalldevs(alldevs, errbuf)

  • Funktion: Mit dieser Funktion werden alle Netzwerkgeräte gefunden.

    Parameter:
alldevs ist der pcap_if_t-Strukturzeiger, der zum Speichern aller gefundenen Netzwerkgeräteinformationen verwendet wird.

errbuf ist ein Zeichenfolgentyp der C-Sprache, der zum Abrufen von Fehlerinformationen verwendet wird.

Verwendungsbeispiel:

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

2.2 Paketerfassungsschnittstelle

  • open_live(device:bytes,snaplen:int,promisc:int,to_ms:int,errbuf)

    Funktion: Diese Funktion wird zum Öffnen eines Netzwerks verwendet Gerät, das Daten erfasst
Parameter:

Gerät ist der Name der Netzwerkschnittstelle, der über die API abgerufen oder manuell angegeben werden kann, wie zum Beispiel: „eth0“

snaplen ist die Länge des erfassten Datenpakets , der nicht größer als 65535 sein darf.

promise Wird verwendet, um zu markieren, ob der Promiscuous-Modus aktiviert ist, und andere Werte stellen den Nicht-Promiscuous-Modus dar.

to_ms stellt die Anzahl der zu wartenden Millisekunden dar . Nach dieser Zeit kehrt die Funktion zum Abrufen des Datenpakets sofort zurück. 0 bedeutet, dass gewartet wird, bis ein Datenpaket eintrifft. Errbuf ist ein C-Sprachzeichenfolgentyp, der zum Abrufen von Fehlerinformationen verwendet wird.

Rückgabewert: Gibt einen Zeiger vom Typ pcap_t zurück. Dieser Zeiger muss in allen nachfolgenden Vorgängen verwendet werden.

Verwendungsbeispiel:
    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)
  • open_offline(fname: bytes,errbuf)

Funktion: Diese Funktion wird zum Öffnen der Offline-Paketerfassungsdatei verwendet

Parameter:

fname ist der Dateiname, wie zum Beispiel: b"/tmp /test1.cap"

errbuf ist ein C-Sprachzeichenfolgentyp, der zum Abrufen von Fehlerinformationen verwendet wird.

Rückgabewert: Gibt einen Zeiger vom Typ pcap_t zurück. Dieser Zeiger muss in allen nachfolgenden Vorgängen verwendet werden.

Verwendungsbeispiel:

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.3 Datenpaketerfassungsschnittstelle

next(handle,pheader)
  • Funktion: Diese Funktion wird verwendet, um Datenpakete zu erhalten, jeweils nur ein Paket.
Parameter:

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

Beispielcode und Laufeffekt:

[Verwandte Empfehlungen: Python3-Video-Tutorial ]

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die libpcap-Bibliothek zur Paketerfassung und Datenverarbeitung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen