30 个版本

0.15.0 2024年2月5日
0.14.1 2023年8月4日
0.14.0 2022年5月13日
0.13.3 2022年3月24日
0.4.0 2019年3月19日

#144解析器实现

Download history 3044/week @ 2024-04-20 2410/week @ 2024-04-27 2304/week @ 2024-05-04 2187/week @ 2024-05-11 2705/week @ 2024-05-18 2754/week @ 2024-05-25 2883/week @ 2024-06-01 2962/week @ 2024-06-08 2673/week @ 2024-06-15 3045/week @ 2024-06-22 2158/week @ 2024-06-29 3219/week @ 2024-07-06 2792/week @ 2024-07-13 2575/week @ 2024-07-20 2724/week @ 2024-07-27 2660/week @ 2024-08-03

11,287 每月下载量
用于 16 个crate(15 个直接使用)

MIT/Apache

175KB
3K SLoC

License: MIT Apache License 2.0 Crates.io Version docs.rs Github CI Minimum rustc version

PCAP 和 PCAPNG 解析器

此crate包含对PCAP和PCAPNG文件的多个解析器。

与其他类似项目相比,它旨在提供对许多可能格式的完整支持(旧版pcap、pcapng、小端或大端等)和功能(具有多个部分、接口和端序的pcapng文件),同时仅使用安全代码且不复制数据(零拷贝)。

代码可在Github上找到,并是Rusticata项目的一部分。

PCAP格式

PCAP格式(通常以.pcap扩展名结尾)相当简单。 PCAPNG格式(通常以.pcapng扩展名结尾)要复杂得多:它可以由多个部分组成,每个部分都有多个接口,具有不同的捕获长度、时间精度甚至端序!

这些格式是容器而非数据格式:数据包包含数据,格式化方式取决于其接口类型。存在许多可能的类型,定义在类型注册表中。一些类型的解析支持是通过使用data功能提供的(默认情况下禁用)。

此crate对这些不同格式提供了抽象。

解析文件

pcap-parser提供了几种解析pcap数据的方法。选择正确的方法主要取决于资源:如果输入文件较小,则可以直接使用parse_pcapparse_pcapng函数。

还有细粒度函数可供使用,例如专门解析某些块类型。它们在pcappcapng模块中列出。

如果输入较大且无法放入内存,则可以使用流式解析器。它们通过迭代块来工作,因此不需要映射整个输入。然而,它们无法跳转到特定的块。

注意:由于PCAPNG的限制,无法直接在文件中定位以获取数据包并处理:调用者必须遍历整个文件并按出现顺序存储(至少)当前节段的接口描述。

示例:流式解析器

以下代码演示了如何使用PcapNGReader流式解析器解析pcap-ng格式的文件。此读取器提供了对文件格式的方便抽象,并负责处理字节序。

use pcap_parser::*;
use pcap_parser::traits::PcapReaderIterator;
use std::fs::File;

let file = File::open(path).unwrap();
let mut num_blocks = 0;
let mut reader = PcapNGReader::new(65536, file).expect("PcapNGReader");
loop {
    match reader.next() {
        Ok((offset, _block)) => {
            println!("got new block");
            num_blocks += 1;
            reader.consume(offset);
        },
        Err(PcapError::Eof) => break,
        Err(PcapError::Incomplete(_)) => {
            reader.refill().unwrap();
        },
        Err(e) => panic!("error while reading: {:?}", e),
    }
}
println!("num_blocks: {}", num_blocks);

请参阅PcapNGReader以获取完整的示例,包括处理链路类型和访问数据包数据。

请参阅pcapng模块以获取有关新捕获文件格式的更多详细信息。

对于旧的pcap文件,请使用类似的代码与LegacyPcapReader流式解析器。

请参阅pcap-analyzer,特别是libpcap-toolspcap-info模块以获取更多示例。

示例:通用流式解析

要创建PCAP或PCAPNG格式的输入pcap读取器,请使用create_reader函数。

序列化

通过启用serialize功能,支持序列化(即生成二进制数据)。大多数结构都获得了to_vec()方法(由ToVec特质提供)。

注意:虽然目前仍在实验中并且可以工作,但支持仍然处于实验阶段。API可能在将来发生变化。

更改

请参阅CHANGELOG.md

许可

在以下任一许可下授权:

任选其一。

贡献

除非您明确声明,否则您提交给包括在作品中并由Apache-2.0许可定义的任何贡献,都应如上所述双重许可,而不附加任何其他条款或条件。

依赖

~1MB
~20K SLoC