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 在 解析器实现
11,287 每月下载量
用于 16 个crate(15 个直接使用)
175KB
3K SLoC
PCAP 和 PCAPNG 解析器
此crate包含对PCAP和PCAPNG文件的多个解析器。
与其他类似项目相比,它旨在提供对许多可能格式的完整支持(旧版pcap、pcapng、小端或大端等)和功能(具有多个部分、接口和端序的pcapng文件),同时仅使用安全代码且不复制数据(零拷贝)。
代码可在Github上找到,并是Rusticata项目的一部分。
PCAP格式
PCAP格式(通常以.pcap
扩展名结尾)相当简单。 PCAPNG格式(通常以.pcapng
扩展名结尾)要复杂得多:它可以由多个部分组成,每个部分都有多个接口,具有不同的捕获长度、时间精度甚至端序!
这些格式是容器而非数据格式:数据包包含数据,格式化方式取决于其接口类型。存在许多可能的类型,定义在类型注册表中。一些类型的解析支持是通过使用data
功能提供的(默认情况下禁用)。
此crate对这些不同格式提供了抽象。
解析文件
pcap-parser
提供了几种解析pcap数据的方法。选择正确的方法主要取决于资源:如果输入文件较小,则可以直接使用parse_pcap
和parse_pcapng
函数。
还有细粒度函数可供使用,例如专门解析某些块类型。它们在pcap
和pcapng
模块中列出。
如果输入较大且无法放入内存,则可以使用流式解析器。它们通过迭代块来工作,因此不需要映射整个输入。然而,它们无法跳转到特定的块。
注意:由于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-tools和pcap-info模块以获取更多示例。
示例:通用流式解析
要创建PCAP或PCAPNG格式的输入pcap读取器,请使用create_reader
函数。
序列化
通过启用serialize
功能,支持序列化(即生成二进制数据)。大多数结构都获得了to_vec()
方法(由ToVec
特质提供)。
注意:虽然目前仍在实验中并且可以工作,但支持仍然处于实验阶段。API可能在将来发生变化。
更改
请参阅CHANGELOG.md
。
许可
在以下任一许可下授权:
- Apache License,版本2.0(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您提交给包括在作品中并由Apache-2.0许可定义的任何贡献,都应如上所述双重许可,而不附加任何其他条款或条件。
依赖
~1MB
~20K SLoC