python3使用libpcap库进行抓包及数据处理的操作方法

目录
  • 一、安装libpcap库
    • 1、在线安装
    • 2、离线安装
      • 2.1 下载离线安装文件
      • 2.2 执行离线安装操作
  • 二、使用libpcap库
    • 1、导入及指定pcap库
    • 2、常用API介绍
      • 2.1 获取网络设备接口
      • 2.2 抓包接口
      • 2.3 数据包获取接口
      • 2.4 写文件接口
      • 2.5 资源释放接口
    • 3、典型使用场景
      • 3.1、网卡实时抓包
      • 3.2、离线数据解析
      • 3.3、使用过滤条件抓包
  • 三、资源下载

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地址:https://pypi.org/project/libpcap/

github 地址:https://github.com/karpierz/libpcap

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

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

这里描述下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、离线数据解析

可以使用libpcap库进行离线抓包文件的解析,这里进行简单的示例:

1)首先需要使用open_offline函数打开pcap文件,需要注意的是,函数的第一个参数必须是byte类型;

2)使用pkthdr函数创建header,获取包头信息(时间戳、包大小)​;

3)使用next函数循环读取数据包,需要注意的是,获取的packet对象的contents是C语言类型,需要使用它ctypes的pointer函数进行转换​;

4)数据包(比如IP头)的解析可使用struct的unpack函数​;

示例代码及运行效果:

完整代码获取途径:

关注微信公众号(聊聊博文,文末可扫码)后回复202210290102获取。

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文件,可从百度网盘获取:

链接: https://pan.baidu.com/s/1u6MtBVUa2aM-C-Xq-EGU3Q?pwd=pwrq

提取码: pwrq

到此这篇关于python3使用libpcap库进行抓包及数据处理的操作方法的文章就介绍到这了,更多相关python libpcap库抓包数据处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python抓包程序mitmproxy安装和使用过程图解

    一.介绍说明 mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler.Charles的功能,只不过它是一个控制台的形式操作. mitmproxy还有两个关联组件.一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理.另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求. mitmproxy的功能: 1.拦截HTTP和HTTPS请求和响应 2.保存HTTP会

  • Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)

    背景说明 感觉微信公众号算得是比较难爬的平台之一,不过一番折腾之后还是小有收获的.没有用Scrapy(估计爬太快也有反爬限制),但后面会开始整理写一些实战出来.简单介绍下本次的开发环境: python3 requests psycopg2 (操作postgres数据库) 抓包分析 本次实战对抓取的公众号没有限制,但不同公众号每次抓取之前都要进行分析.打开Fiddler,将手机配置好相关代理,为避免干扰过多,这里给Fiddler加个过滤规则,只需要指定微信域名mp.weixin.qq.com就好:

  • 使用Python实现windows下的抓包与解析

    系统环境:windows7,选择windows系统是因为我对自己平时日常机器上的流量比较感兴趣 python环境:python2.7 ,这里不选择python3的原因,是因为接下来要用到的scapy包在python3中安装较于python2要麻烦得多.如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程. 需要的python包:scapy和dpkt 抓包代码: from scapy.sendrecv import sniff from scapy.u

  • python调用tcpdump抓包过滤的方法

    本文实例为大家分享了python调用tcpdump抓包过滤的具体代码,供大家参考,具体内容如下 之前在linux用python脚本写一个抓包分析小工具,实在不想用什么libpcap.pypcap所以,简单来了个tcpdump加grep搞定.基本思路是分别起tcpdump和grep两个进程,进程直接通过pipe交换数据,简单代码如下: #! /usr/bin/python def tcpdump(): import subprocess, fcntl, os # sudo tcpdump -i e

  • Python爬虫谷歌Chrome F12抓包过程原理解析

    浏览器打开网页的过程就是爬虫获取数据的过程,两者是一样一样的.浏览器渲染的网页是丰富多彩的数据集合,而爬虫得到的是网页的源代码htm有时候,我们不能在网页的html代码里面找到想要的数据,但是浏览器打开的网页上面却有这些数据.这就是浏览器通过ajax技术异步加载(偷偷下载)了这些数据. 大家禁不住要问:那么该如何看到浏览器偷偷下载的那些数据呢? 答案就是谷歌Chrome浏览器的F12快捷键,也可以通过鼠标右键菜单"检查"(Inspect)打开Chrome自带的开发者工具,开发者工具会出

  • python 抓包保存为pcap文件并解析的实例

    首先是抓包,使用scapy模块, sniff()函数 在其中参数为本地文件路径时,操作为打开本地文件 若参数为BPF过滤规则和回调函数,则进行Sniff,回调函数用于对Sniff到的数据包进行处理 import os from scapy.all import * pkts=[] count=0 pcapnum=0 filename='' def test_dump_file(dump_file): print "Testing the dump file..." if os.path

  • Python Charles抓包配置实现流程图解

    配置 大佬的博客真的很详细很详细,我就不重复造轮子了,看这里 补充解释 在这一步疑问很多,大佬说的不是很详细,就由我来补充下吧~ 在PC端Charles这样点击: 之后会这样提示:我们要记住图中的红色方框圈起来的! 第一个是手机代理IP和端口号!第二个是移动端证书下载网址 移动端证书配置 2.1 首先连接到电脑的WiFi(和电脑同一WiFi或电脑的热点都可以) 2.2 点击进行配置代理 ​最后点击存储,之后会出现PC端会这样提示,记住不要回车!!!因为默认是Deny(拒绝) 要点击Allow(允

  • python如何利用Mitmproxy抓包

    一.使用 安装 pip install mitmproxy mitmproxy 是具有控制台界面的交互式,支持SSL的拦截代理 mitmdump是mitmproxy的命令行版本.想想tcpdump为HTTP mitmweb 是一个基于web的界面,适用于mitmproxy mitmproxy(mac).mitmdump.mitmweb(win) 这三个命令中的任意一个即可 mitmweb -s mitm.py 命令行启动默认端口8080 mitmweb -p 8888 -s mitm.py 指定

  • python3使用libpcap库进行抓包及数据处理的操作方法

    目录 一.安装libpcap库 1.在线安装 2.离线安装 2.1 下载离线安装文件 2.2 执行离线安装操作 二.使用libpcap库 1.导入及指定pcap库 2.常用API介绍 2.1 获取网络设备接口 2.2 抓包接口 2.3 数据包获取接口 2.4 写文件接口 2.5 资源释放接口 3.典型使用场景 3.1.网卡实时抓包 3.2.离线数据解析 3.3.使用过滤条件抓包 三.资源下载 python版本:python 3.9 libpcap版本:1.11.0b7 python libpca

  • python实现linux下抓包并存库功能

    最近项目需要抓包功能,并且抓包后要对数据包进行存库并分析.抓包想使用tcpdump来完成,但是tcpdump抓包之后只能保存为文件,我需要将其保存到数据库.想来想去shell脚本似乎不太好实现,于是用了比较热门的python来实现.不得不说,python丰富的第三方库确实是很强大,下面是具体的功能代码. from apscheduler.scheduler import Scheduler import os import sys import time import MySQLdb impor

  • 在 Linux 命令行中使用 tcpdump 抓包的一些功能

    tcpdump 是一款灵活.功能强大的抓包工具,能有效地帮助排查网络故障问题. 以我作为管理员的经验,在网络连接中经常遇到十分难以排查的故障问题.对于这类情况, tcpdump 便能派上用场. tcpdump 是一个命令行实用工具,允许你抓取和分析经过系统的流量数据包.它通常被用作于网络故障分析工具以及安全工具. tcpdump 是一款强大的工具,支持多种选项和过滤规则,适用场景十分广泛.由于它是命令行工具,因此适用于在远程服务器或者没有图形界面的设备中收集数据包以便于事后分析.它可以在后台启动

  • python3中requests库重定向获取URL

    前言: 有时候 我们抓取一些页面,发现一些url 有重定向, 返回 301 ,或者302 这种情况. 那么我们如何获取真实的URL呢? 或者跳转后的URL呢? 这里我使用 requests 作为演示 假设我们要访问 某东的电子商务网站,我只记得网站好像是 http://jd.com import requests def request_jd(): url = 'http://jd.com/' #allow_redirects= False 这里设置不允许跳转 response = reques

  • Android设备上非root的抓包实现方法(Tcpdump方法)

    通常我们在Android应用中执行某个命令时会使用"Runtime.getRuntime().exec("命令路径")"这种方式,但是当我们执行抓包操作时,使用这条命令无论如何都不行,通过下面代码打印结果发现,该命令一定要在root权限下才能执行. BufferedReader brW = new BufferedReader(new InputStreamReader(p.getErrorStream())); while((str = brW.readLine(

  • Python3 使用pillow库生成随机验证码

    Python3 使用pillow库生成随机验证码的代码如下所示: import random # pillow 包的使用 from PIL import Image,ImageDraw,ImageFont,ImageFilter #Image 负责处理图片 #ImageDraw 负责处理画笔 #ImageFont 负责处理文字 #ImageFilter负责处理路径 img=Image.new('RGB',(150,50),(255,255,255)) #建立一个图片 ''' RGB:表示采用RG

  • 易语言制作网截抓包工具的代码

    常量数据表 .版本 2 .常量 编码常量, "<文本长度: 10797>", , 名称:编码_GB2312 英文名称:Encoding_GB2312 类型:文本型 值:"GB2312" 列举各种编码类型 全局变量表 .版本 2 .全局变量 系统配置路径, 文本型 网截抓包工具 .版本 2 .支持库 eNetIntercept .支持库 eGrid .支持库 iconv .支持库 iext .支持库 iext2 .程序集 主程序集 .程序集变量 服务安装,

  • PHPCrawl爬虫库实现抓取酷狗歌单的方法示例

    本文实例讲述了PHPCrawl爬虫库实现抓取酷狗歌单的方法.分享给大家供大家参考,具体如下: 本人看了网络爬虫相关的视频后,手痒痒,想爬点什么.最近Facebook上表情包大战很激烈,就想着把所有表情包都爬下来,却一时没有找到合适的VPN,因此把酷狗最近一月精选歌曲和简单介绍抓取到本地.代码写得有点乱,自己不是很满意,并不想放上来丢人现眼.不过转念一想,这好歹是自己第一次爬虫,于是...就有了如下不堪入目的代码~~~(由于抓取的数据量较小,所以没有考虑多进程什么的,不过我看了一下PHPCrawl

随机推荐