#事件日志 #XML解析器 #日志解析器 #XML格式 #安全 #日志格式 #跨平台

bin+lib evtx

Windows XML事件日志(EVTX)格式的快速(且安全)解析器

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解析器实现

Download history 723/week @ 2024-05-03 432/week @ 2024-05-10 452/week @ 2024-05-17 390/week @ 2024-05-24 517/week @ 2024-05-31 493/week @ 2024-06-07 551/week @ 2024-06-14 434/week @ 2024-06-21 289/week @ 2024-06-28 279/week @ 2024-07-05 398/week @ 2024-07-12 655/week @ 2024-07-19 494/week @ 2024-07-26 417/week @ 2024-08-02 357/week @ 2024-08-09 246/week @ 2024-08-16

1,565 每月下载量
用于 7 个crate(6个直接)

MIT/Apache

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/

安装(相关二进制工具)

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)和 jqfd --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 挂载中产生的开销)。

基准测试的库

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日志时,evtxpython-evtx650倍 以上。

使用最大可用的线程(逻辑核心数) - evtxgolang-evtx 快约 8-10倍。这两种实现都使用了类似的并行策略。

注意事项

  • 目前未实现
    • CDATA节点。
    • EVTHandle 节点类型。

如果解析器在这些节点中出错,请随时打开一个问题或给我发送一个带有示例的电子邮件。

许可证

根据您的选择,许可如下

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交的任何有意包含在作品中的贡献,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~7–17MB
~206K SLoC