41次发布
0.8.3 | 2024年8月3日 |
---|---|
0.8.2 | 2024年4月4日 |
0.8.1 | 2023年2月17日 |
0.8.0 | 2022年8月29日 |
0.1.2 | 2019年3月31日 |
#74 在 解析器实现
1,565 每月下载量
用于 7 个crate(6个直接)
215KB
4.5K SLoC
EVTX
Windows XML EventLog格式的跨平台解析器
特性
- 🔒 使用100%安全的Rust实现 - 并且在Rust支持的(有stdlib的)所有平台上工作。
- ⚡ 快速 - 见下面的基准测试。它比任何其他实现都快得多!
- 🚀 多线程。
- ✨ 支持XML和JSON输出,两者都是直接从令牌树构建的,彼此独立(不执行xml2json转换!)
- ⛏️ 支持一些缺失记录/块的恢复!
- 🐍 Python绑定也提供在 https://github.com/omerbenamram/pyevtx-rs(以及在PyPi https://pypi.ac.cn/project/evtx/)
安装(相关二进制工具)
- 从 https://github.com/omerbenamram/evtx/releases 下载最新可执行文件发布版
- 发布会自动构建为Windows、macOS和Linux。(仅64位可执行文件)
- 使用
cargo install evtx
从源代码构建
evtx_dump
(二进制工具)
此crate提供的的主要二进制工具是 evtx_dump
,它提供了一种快速将 .evtx
文件转换为不同输出格式的方法。
一些示例
evtx_dump <evtx_file>
将以 XML 格式输出 evtx 记录的内容。evtx_dump -o json <evtx_file>
将以 JSON 格式输出 evtx 记录的内容。evtx_dump -f <output_file> -o json <input_file>
将以 JSON 格式将 evtx 记录的内容输出到指定的文件。
evtx_dump
可以与 fd 结合使用,方便批量处理文件。
fd -e evtx --x evtx_dump --o jsonl
将扫描文件夹并将所有 evtx 文件输出到一个单独的 jsonlines 文件中。fd --e evtx --x evtx_dump '{}' --f '{.}.xml
将为文件夹中的所有文件创建一个紧邻的 xml 文件,递归地处理所有文件!- 如果需要在 JSON 中添加文件来源,可以使用
xargs
(或 mac 上的gxargs
)和jq
:fd --a --e evtx | xargs -I input sh -c "evtx_dump -o jsonl input | jq --arg path "input" '. + {path: \$path}'"
注意:默认情况下,evtx_dump
将尝试使用多线程,这意味着记录可能会乱序返回。
要强制使用单线程(这将确保顺序),可以传递 -t 1
。
示例用法(作为库)
use evtx::EvtxParser;
use std::path::PathBuf;
// Change this to a path of your .evtx sample.
let fp = PathBuf::from(format!("{}/samples/security.evtx", std::env::var("CARGO_MANIFEST_DIR").unwrap()));
let mut parser = EvtxParser::from_path(fp).unwrap();
for record in parser.records() {
match record {
Ok(r) => println!("Record {}\n{}", r.event_record_id, r.data),
Err(e) => eprintln!("{}", e),
}
}
在编译时启用功能 "multithreading"(默认启用)将启用并行版本。
性能基准测试
使用多线程时 - 与任何其他解析器相比,evtx
都要快得多。对于单核性能,它是最快且唯一支持 xml 和 JSON 输出的跨平台解析器。
使用 hyperfine
(统计测量工具)在我的机器上进行了性能基准测试。
我在 12 核 AMD Ryzen 3900X 上运行测试。
测试在 WSL2 下运行,在 linux 文件系统上(因此不应产生从读取 windows 挂载中产生的开销)。
基准测试的库
python-evtx
(https://github.com/williballenthin/python-evtx) - 使用 CPython 和 PyPylibevtx
(https://github.com/libyal/libevtx)golang-evtx
(https://github.com/0xrawsec/golang-evtx.git) - 仅 JSON(使用多线程)evtx
(https://github.com/Velocidex/evtx) - 仅 JSON。evtx
(此库)
evtx(1 线程) | evtx(8 线程) | evtx(24 线程) | libevtx(C) | velocidex/evtx(go) | golang-evtx(使用多进程) | python-evtx(CPython 3.7.6) | python-evtx (PyPy 7.3.0) | |
---|---|---|---|---|---|---|---|---|
30MB evtx (XML) | 1.155 s ± 0.008 s | 277.4 ms ± 5.8 ms | 177.1 ms ± 4.5 ms | 4.509 s ± 0.100 s | 不支持 | 不支持 | 4m11.046s (运行一次) | 1m12.828s (运行一次) |
30MB evtx (JSON) | 1.631 s ± 0.006 s | 341.6 ms ± 7.3 ms | 207.2 ms ± 7.2 ms | 不支持 | 5.587 s ± 0.086 s | 2.216 s ± 0.027 s | 不支持 | 不支持 |
注意:显示的数字是 实时
测量值(调用完成所需时间)。由于同步开销,当使用多线程/多进程时,用户时间
测量值更高。
使用8个线程 - 当导出XML日志时,evtx
比 python-evtx
快 650倍 以上。
使用最大可用的线程(逻辑核心数) - evtx
比 golang-evtx
快约 8-10倍。这两种实现都使用了类似的并行策略。
注意事项
- 目前未实现
- CDATA节点。
- EVTHandle 节点类型。
如果解析器在这些节点中出错,请随时打开一个问题或给我发送一个带有示例的电子邮件。
许可证
根据您的选择,许可如下
- Apache License,版本 2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交的任何有意包含在作品中的贡献,应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~7–17MB
~206K SLoC