经验大分享:python3使用libpcap库进行抓包及数据处理

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 经验大分享:python3使用libpcap库进行抓包及数据处理

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地址:

github 地址:

一、安装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官网找的:

这里描述下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类型指针,后面的所有操作都要使用这个//代码效果参考:http://www.zidongmutanji.com/bxxx/587774.html

指针。

使用示例:

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 //代码效果参考:http://www.zidongmutanji.com/zsjx/522565.html

= 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_dumpert类型指针

返回值:无返回值

3、典型使用场景

3.1、网卡实时抓包

可以使用libpcap库进行网卡实时数据抓包,这里进行简单的示例:

1)首先需要获取或指定抓包设备

//代码效果参考:http://www.zidongmutanji.com/zsjx/482273.html

方法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

示例代码及运行效果:

完整代码获取途径:

三、资源下载

本文涉及libpcap源代码及whl文件,可从百度网盘获取:

转载请注明出处,谢谢!

相关文章
|
28天前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
163 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
27天前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
59 20
|
25天前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
52 7
|
18天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
72 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
2月前
|
XML JSON 数据库
Python的标准库
Python的标准库
182 77
|
22天前
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
42 1
|
1月前
|
人工智能 分布式计算 数据处理
有奖评测,基于分布式 Python 计算服务 MaxFrame 进行数据处理
阿里云MaxCompute MaxFrame推出分布式Python计算服务MaxFrame评测活动,助力开发者高效完成大规模数据处理、可视化探索及ML/AI开发。活动时间为2024年12月17日至2025年1月31日,参与者需体验MaxFrame并发布评测文章,有机会赢取精美礼品。
|
2月前
|
XML JSON 数据库
Python的标准库
Python的标准库
64 11
|
29天前
|
程序员 Linux Python
python中模板和包的使用
本文介绍了 Python 模块和包的基本概念及使用方法。模块是 Python 程序结构的核心,每个以 `.py` 结尾的源文件都是一个模块,包含可重用的代码。文章详细讲解了模块的导入方式(如 `import` 和 `from...import`),模块的搜索顺序,以及如何创建和发布自己的模块。此外,还介绍了包的概念,包是包含多个模块的特殊目录,并通过 `__init__.py` 文件定义对外提供的模块列表。最后,文章简述了如何使用 `pip` 工具管理第三方模块的安装与卸载。作者:大石头的笔记;来源:稀土掘金。
|
2月前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
97 8