python3使用libpcap库进行抓包及数据处理
python版本:python 3.9
libpcap版本:1.11.0b7

一、安装libpcap库
1、在线安装

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类型指针,后面的所有操作都要使用这个指针。
使用示例:
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 = 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类型;
示例代码及运行效果:

完整代码获取途径:
关注微信公众号(聊聊博文,文末可扫码)后回复 202210290101 获取。
3.2、离线数据解析
完整代码获取途径:
网卡实时抓包和离线数据解析时,可以设置过滤条件,避免数据量过大。
过滤条件示例:
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
示例代码及运行效果:

完整代码获取途径:
三、资源下载
python3使用libpcap库进行抓包及数据处理的更多相关文章
- 超详细的网络抓包神器 tcpdump 使用指南
原文链接:Tcpdump 示例教程 本文主要内容翻译自<Tcpdump Examples>. tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在 ...
- 网络抓包工具wireshark and tcpdump 及其实现基于的libpcap
最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世 ...
- 一行代码避免OkHttp的网络库应用被抓包
在建立socket连接之前,OkHttp会获取系统的代理信息,如果设置代理,那么通过DNS解析其IP然后使用代理IP来建立socket连接.如果没有设置代理,那么会使用请求中的url的IP地址,来建立 ...
- 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...
- linux下libpcap抓包分析
一.首先下载libpcap包http://www.tcpdump.org/#latest-release 然后安装,安装完成后进入安装根目录的tests文件夹,编译运行findalldevstest. ...
- Python3,x:Fiddler抓包工具如何进行手机APP的数据爬取
示例一:苹果手机抓取教程 https://www.cnblogs.com/lizm166/p/8693085.html https://blog.csdn.net/cui130/article/det ...
- 九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import j ...
- winpcap抓包原理
winpcap抓包原理 WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤.WinPcap 是 BPF 模型和 Libpcap 函数库在 ...
- tcpdump抓包命令
本文转自 : http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html http://www.itshouce.com.cn/l ...
随机推荐
- mongo数据库-mongo角色权限
Built-In Roles(内置角色): 1. 数据库用户角色:read.readWrite; 2. 数据库管理角色:dbAdmin.dbOwner.userAdmin: 3. 集群管理角色:clu ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- pod资源的健康检查-liveness探针的httpGet使用
使用liveness探针httpget方式检测pod健康,httpGet方式使用的最多 [root@k8s-master1 tanzhen]# cat nginx_pod_httpGet.yaml a ...
- Dubbo源码(九) - 服务调用过程
1. 前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 源码分析均基于官方Demo,路径:dubbo/dubbo-demo 如果没有看过之前Dub ...
- BNC Part-of-speech codes
Extracted from the BNC Manual AJ0 adjective (general or positive) e.g. good, old AJC comparative adj ...
- MySQL 不同隔离级别,都使用了什么锁?
大家好,我是树哥. 在上篇文章,我们聊了「MySQL 啥时候会用表锁,啥时候用行锁」这个问题.在文章中,我们还留了一个问题,即:如果查询或更新时的数据特别多,是否从行锁会升级为表锁?此外,还有朋友留言 ...
- DFS算法-求集合的所有子集
目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...
- Java八股文纯享版——篇②:并发编程
注: 1.笔记为个人归纳整理,尽力保证准确性,如有错误,恳请指正 2.写文不易,转载请注明出处 3.本文首发地址 https://blog.leapmie.com/archives/c02a6ed1/ ...
- synchronized锁详解
synchronized的意义 解决了Java共享内存模型带来的线程安全问题: 如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(针对这个问题进行分析 ...
- Centos7.6内核升级
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483766&idx=1&sn=4750fd4e ...
