Maison >développement back-end >Tutoriel Python >Comment utiliser la bibliothèque libpcap pour la capture de paquets et le traitement des données en Python
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
Utilisez pip pour installer directement :
pip install libpcap
La dernière version est installée par défaut.
Vous pouvez trouver le code source ou le fichier whl sur la page pypi.
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
import libpcap libpcap.config(LIBPCAP="wpcap")
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.
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)
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)
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)
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代表出错
close(handle)
功能:释放pcap_t类型指针
参数:
handle为pcap_t类型指针
返回值:无返回值
dump_close(handle)
功能:释放pcap_dumper_t类型指针
参数:
handle为pcap_dumper_t类型指针
返回值:无返回值
可以使用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类型;
示例代码及运行效果:
可以使用libpcap库进行离线抓包文件的解析,这里进行简单的示例:
1)首先需要使用open_offline函数打开pcap文件,需要注意的是,函数的第一个参数必须是byte类型;
2)使用pkthdr函数创建header,获取包头信息(时间戳、包大小);
3)使用next函数循环读取数据包,需要注意的是,获取的packet对象的contents是C语言类型,需要使用它ctypes的pointer函数进行转换;
4)数据包(比如IP头)的解析可使用struct的unpack函数;
示例代码及运行效果:
网卡实时抓包和离线数据解析时,可以设置过滤条件,避免数据量过大。
过滤条件示例:
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!