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

2022-10-31 20:46:10
目录
一、安装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)>

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

                                          链接:>

                                          提取码: pwrq 

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