使用libpcap解析pcap和pcapng文件

本文介绍了pcap和pcapng两种网络抓包格式,包括它们的文件结构特点,如pcap的固定文件头和块头信息,以及pcapng的可扩展性和支持多接口捕获的特性。还详细阐述了如何使用libpcap库进行离线读取这两种格式的文件,并提供了pcapng转换为pcap的实用方法,包括tcpdump工具的使用和Wireshark软件的另存为功能。此外,文章还给出了一个使用libpcap进行离线读取的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 pcap与pcapng特征简介

1.pcap:早期计算机网络抓包格式,几乎所有抓包工具都支持pcap,pcap文件的首四个字节分别是0xd4,0xc3,0xb2,0xa1,pcap文件有文件头和块组成,文件头是固定格式:

struct pcap_file_header {
    uint32_t magic = 0;
    uint16_t max_version = 0;
    uint16_t min_version = 0;
    uint32_t time_zone = 0;
    uint32_t sig_flag = 0;
    uint32_t snap_len = 0;
    uint32_t link_type = 0;
};

块由块头信息和数据信息组成,数据长度由块头信息决定,块头信息定义如下:

struct pcap_pkt_header {
    uint32_t time_sec;
    uint32_t time_usec;
    uint32_t cap_len;
    uint32_t pkt_len;
};

2.pcapng:下一代抓包格式,支持不同路线以寻求标准化,pcapng格式通过使用标准化块和字段来实现可扩展性需求,其特性包括:支持从多个接口捕获,改进时间戳分辨率,在捕获文件插入注释,在捕获文件插入额外元数据等,其基本格式如下:

与pcap不同,pcapng文件首4个字节是0xa,0xd,0xd,0xa。

二 pcapng转pcap

pcapng转pcap方式有很多中,其中列举两种:

1.使用tcpdump:tcpdump -r XXX.pcapng -w XXX.pcap

2.使用wireshark打开pcapng文件后,点击另存为pcap文件即可。

需要注意:不是所有pcapng都可以转pcap文件。

三 libpcap离线读取pcap与pcapng文件接口

libpcap支持在线抓包,也可以使用相应API进行离线抓包:

#include <pcap/pcap.h>
char errbuf[PCAP_ERRBUF_SIZE] = ""; // PCAP_ERRBUF_SIZE为512字节
pcap_t *pcap_open_offline(const char *fname, char *errbuf); // fname可指向pcap或pcapng
pcap_t *pcap_ptr = pcap_open_offline("./xx.pcapng", errbuf);
if (!pcap_ptr) {
    // 如果ptr为空,则说明抓包文件有问题,不是pcap或者pcapng
}
struct pcap_pkthdr pkthdr = { 0 };
/*struct pcap_pkthdr {
        struct timeval ts;      /* time stamp */
        bpf_u_int32 caplen;     /* length of portion present */ // 抓包长度
        bpf_u_int32 len;        /* length this packet (off wire) */ // 时间包长度 caplen <= len
};*/
while (true) {
    const u_char *pkt_buff = pcap_next(pcap_ptr, &pkthdr);  // 循环读取文件
    if (!pkt_buff) {
        std::cerr << "pcapng read over." << std::endl;
        break;
    }
    if (pkthdr.caplen > G_MAX_PCAP_BUFFER_BODY_LEN) {        // 读取文件异常
        std::cerr << "read pcap body error." << std::endl;
        break;
    }
    // pkt_buff执行抓包数据 可进行相关业务处理
    ...
}
pcap_close(pcap_ptr);   // 必须关闭句柄 不然内存泄漏

四 使用libpcap离线读取pcap与pcapng文件客户端

1.功能描述:对指定目录里的pcap和pcapng进行处理

2.代码:https://github.com/wangzhicheng2013/pcapng_file_process

五 使用tcpdump将pcapng转为pcap

tcpdump -r bans3.pcapng -w bans3.pcap

 

### 如何解析CAP文件 CAP文件是一种常见的数据包捕获文件格式,主要用于存储网络通信数据包。解析CAP文件需要了解其内部结构,并使用适当的工具或编程语言来读取处理这些数据。 #### CAP文件格式说明 CAP文件的格式通常由两部分组成:文件数据包记录。以下是CAP文件的基本结构[^1]: - **文件头**:CAP文件的前24个字节是文件头,包含版本信息、时间戳精度等。 - **数据包记录**:每个数据包记录包含捕获的时间戳、数据包长度以及实际的数据内容。 在Windows下的WiresharkLinux下的tcpdump生成的CAP文件遵循相同的PCAP文件格式。这种格式的具体定义可以在`pcap.h`头文件中找到[^1]。例如,在Linux系统中,可以查看`/usr/include/pcap.h`文件以获取详细的结构体定义。 #### 工具推荐 以下是一些常用的工具库,用于解析CAP文件: 1. **Wireshark** Wireshark是一个功能强大的网络协议分析器,可以直接打开并解析CAP文件。它提供了图形化界面,方便用户查看数据包的详细信息[^1]。 2. **tcpdump** tcpdump是一个命令行工具,不仅可以抓取数据包,还可以读取CAP文件的内容。例如,使用以下命令可以显示CAP文件中的数据包: ```bash tcpdump -r filename.cap ``` 3. **Scapy (Python库)** Scapy是一个基于Python的交互式数据包操作程序,支持CAP文件的读取解析。以下是一个简单的代码示例,展示如何使用Scapy读取CAP文件: ```python from scapy.all import rdpcap packets = rdpcap('filename.cap') for packet in packets: print(packet.summary()) ``` 4. **dpkt (Python库)** dpkt是一个高效的Python库,用于解析CAP文件。以下是一个使用dpkt解析CAP文件的示例: ```python import dpkt with open('filename.cap', 'rb') as f: pcap = dpkt.pcap.Reader(f) for timestamp, buf in pcap: eth = dpkt.ethernet.Ethernet(buf) print(repr(eth)) ``` 5. **libpcap/WinPcap** libpcap(Linux)WinPcap(Windows)是两个底层库,提供了对CAP文件解析支持。开发者可以通过C/C++调用这些库来实现自定义的解析逻辑[^1]。 #### 不同抓包软件的CAP文件差异 不同抓包软件生成的CAP文件可能在头部存在差异。例如,Sniffer生成的CAP文件前4个字节为`\x58\x43\x50\x00`,而Wiresharktcpdump生成的CAP文件前4个字节为`\xd4\xc3\xb2\xa1`[^2]。因此,在解析CAP文件时,需要先检查文件头以确定其具体格式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值