Maison  >  Article  >  développement back-end  >  Comment utiliser la bibliothèque libpcap pour la capture de paquets et le traitement des données en Python

Comment utiliser la bibliothèque libpcap pour la capture de paquets et le traitement des données en Python

WBOY
WBOYavant
2022-11-01 14:10:135240parcourir

Cet article vous apporte des connaissances pertinentes sur Python Il présente principalement comment utiliser la bibliothèque libpcap pour la capture de paquets et le traitement des données, y compris l'installation de libpcap, l'utilisation de la bibliothèque libpcap, etc.

[Recommandations associées : Tutoriel vidéo Python3 ]

version python : python 3.9

version libpcap : 1.11.0b7

python la bibliothèque libpcap est un package de développement pour le langage c sous-jacent bibliothèque libpcap , vise à fournir l'API de la bibliothèque unix c libpcap (ainsi que Npcap et WinPcap fournis pour les systèmes win32) accessible aux applications python, en utilisant directement le code c sous-jacent avec de très bonnes performances.

Voici comment installer et utiliser la bibliothèque libpcap dans python3.9 sous l'environnement Windows 10 (pour les systèmes Linux et Mac, veuillez vous référer à Windows).

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

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

1 Installez la bibliothèque libpcap

. 1 , Installation en ligne

Utilisez pip pour installer directement :

pip install libpcap

La dernière version est installée par défaut.

2. Installation hors ligne

2.1 Téléchargez le fichier d'installation hors ligne

Vous pouvez trouver le code source ou le fichier whl sur la page pypi.

2.2 Effectuer une installation hors ligne

1) Vous pouvez utiliser le code source pour installer

Extraire le fichier dans le répertoire actuel, puis exécuter la commande d'installation :

python -m pip install ./libpcap-1.11.0b7

2) Vous peut également utiliser le fichier whl pour l'installation hors ligne

La commande d'installation est la suivante :

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

2. Utilisez la bibliothèque libpcap

1 Importez et spécifiez la bibliothèque pcap

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

2. aux API courantes

tcpdump est implémenté sur la base de libpcap, la documentation de libpcap en langage C peut être trouvée sur le site officiel de tcpdump :

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

Voici une description des interfaces courantes de Python.

2.1 Obtenir l'interface du périphérique réseau

  • lookupdev(errbuf)

Fonction : Cette fonction est utilisée pour trouver le périphérique réseau, et la valeur renvoyée peut être appelée directement par la fonction open_live.

Paramètres :

errbuf est un type de chaîne en langage C, utilisé pour obtenir des informations sur les erreurs.

Exemple d'utilisation :

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)

Fonction : Cette fonction est utilisée pour rechercher tous les périphériques réseau.

Paramètres :

alldevs est le pointeur de structure pcap_if_t, utilisé pour stocker toutes les informations trouvées sur les périphériques réseau.

errbuf est un type de chaîne en langage C, utilisé pour obtenir des informations sur les erreurs.

Exemple d'utilisation :

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 Interface de capture de paquets

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

Fonction : Cette fonction est utilisée pour ouvrir un réseau appareil qui capture les données

Paramètres :

device est le nom de l'interface réseau, qui peut être obtenu via l'API, ou peut être spécifié manuellement, tel que : "eth0"

snaplen est la longueur du paquet de données capturé , qui ne peut pas être supérieur à 65535

promise Il est utilisé pour marquer si le mode promiscuité est activé. 1 représente le mode promiscuité, et d'autres valeurs représentent le mode non promiscuité

to_ms représente le nombre de millisecondes à attendre. . Passé ce délai, la fonction permettant d'obtenir le paquet de données reviendra immédiatement. 0 signifie attendre qu'il y ait un paquet de données. Arrival

errbuf est un type de chaîne en langage C, utilisé pour obtenir des informations d'erreur.

Valeur de retour : renvoie un pointeur de type pcap_t. Toutes les opérations ultérieures doivent utiliser ce pointeur.

Exemple d'utilisation :

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)

Fonction : Cette fonction est utilisée pour ouvrir le fichier de capture de paquets hors ligne

Paramètres :

fname est le nom du fichier, tel que : b"/tmp /test1.cap"

errbuf est un type de chaîne en langage C, utilisé pour obtenir des informations sur les erreurs.

Valeur de retour : renvoie un pointeur de type pcap_t. Toutes les opérations ultérieures doivent utiliser ce pointeur.

Exemple d'utilisation :

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 Interface d'acquisition de paquets de données

  • next(handle,pheader)

Fonction : Cette fonction est utilisée pour obtenir des paquets de données, un seul paquet à la fois.

Paramètres :

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

Exemple de code et effet d'exécution :

[Recommandations associées : Tutoriel vidéo Python3 ]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer