• 技术文章 >后端开发 >Python教程

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

    WBOYWBOY2022-11-01 14:10:13转载1413
    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了使用libpcap库进行抓包及数据处理的操作方法,包括了安装libpcap、使用libpcap库等等内容,下面一起来看一下,希望对大家有帮助。

    php入门到就业线上直播课:进入学习

    【相关推荐:Python3视频教程

    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 获取网络设备接口

    功能:该函数用于查找网络设备,返回的值可以被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)

    功能:该函数用于查找所有网络设备。

    参数:

    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 抓包接口

    功能:该函数用于打开一个用于捕获数据的网络设备

    参数:

    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)

    功能:该函数用于打开离线抓包文件

    参数:

    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 数据包获取接口

    功能:该函数用于获取数据包,一次只获取一个包。

    参数:

    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 写文件接口

    功能:该函数用于打开文件,存储获取到的数据包。

    参数:

    handle为pcap_t类型指针

    fname为文件名称

    返回值:返回pcap_dumper_t 类型指针,后面的所有操作都要使用这个指针。

    使用示例:

    import libpcap as pcap
    
    fname = b"realtime1.cap"
    fPcap = pcap.dump_open(handle,fname)

    功能:该函数用于存储获取到的数据包。

    参数:

    handle为pcap_dumper_t类型指针

    pheader为pcap_pkthdr结构体指针

    packet是数据包

    返回值:无返回值

    使用示例:

    fPcapUbyte = ct.cast(fPcap,ct.POINTER(ct.c_ubyte))
    pcap.dump(fPcapUbyte,pheader,packet)

    功能:该函数用于将缓存的数据刷到磁盘

    参数:

    handle为pcap_dumper_t类型指针

    返回值:错误码,0代表成功,-1代表出错

    2.5 资源释放接口

    功能:释放pcap_t类型指针

    参数:

    handle为pcap_t类型指针

    返回值:无返回值

    功能:释放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 8.8.8.8

    src 8.8.8.8

    dst 8.8.8.8

    2)过滤端口

    port 22

    portange 1-1024

    src port 22

    dst port 22

    3)指定协议

    tcp

    udp

    icmp

    4)使用组合条件

    src localhost and dst port 22

    src localhost && dst port 22

    port 80 or 22

    port 80 || 22

    示例代码及运行效果:

    【相关推荐:Python3视频教程

    以上就是python使用libpcap库进行抓包及数据处理的操作方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:脚本之家,如有侵犯,请联系admin@php.cn删除

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    快捷开发Web应用及小程序:点击使用

    支持亿级表,高并发,自动生成可视化后台。

    专题推荐:python
    上一篇:怎么使用Python进行多线程并发下载图片 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Mac环境下怎么设置默认Python 版本?• Python Scala中使用def语句定义方法的详细过程• 用Python获取Amazon亚马逊的商品信息• 详细解析Python实现定时任务之apscheduler• 一文了解CPython中的垃圾收集器
    1/1

    PHP中文网