Karib0u/capa-x

GitHub: Karib0u/capa-x

Mandiant capa 静态分析后端的独立 Rust 原生实现,无需 Python 即可运行未经修改的 capa 规则进行恶意软件能力识别。

Stars: 1 | Forks: 0

capa-x logo

# capa-x capa-x 是一个独立的原生 Rust 实现,对应 [Mandiant capa](https://github.com/mandiant/capa) 静态后端。它在分析时 无需 Python 即可运行未经修改的 capa 规则。它不隶属于 Google LLC 或 Mandiant, Inc., 也未获得其认可。 - 支持 x86/x64 PE、ELF、.NET/CLR、原始 shellcode 和 capa freeze 文件, 外加 x86_64/AArch64 Mach-O(`-f macho`,一个 capa-x 扩展——见下文) 以及原生 AArch64 PE/ELF。 - 在任何 `--jobs` 值下都能产生确定性输出。 - 对于不支持的输入和未知的规则语法,会结合上下文信息报错。 - 在 200 个样本的评估语料库中,与锁定的 Python capa 9.4.0 达到了 98.55% 的规则级一致性。 Python capa 是行为参考标准。capa-x 是一个原生后端,并不能完全 替代所有的 capa 输入格式。已接受的后端差异 记录在 [KNOWN_DIVERGENCES.md](KNOWN_DIVERGENCES.md) 中。 ## 支持的输入 | 输入 | 状态 | 参考 | |---|---|---| | PE x86/x64 | 支持 | Python capa 9.4.0, Vivisect | | PE AArch64 (`IMAGE_FILE_MACHINE_ARM64`) | 支持 —— **capa-x 扩展** | 无 Python oracle;见下文 | | ELF x86/x64 | 支持 | Python capa 9.4.0, Vivisect | | ELF AArch64 | 支持 | 无原始 AArch64 的 Python oracle;基于 Ghidra BinExport2 验证 | | .NET / CLR 托管 PE | 支持 | Python capa 9.4.0, `dnfile` | | 原始 shellcode,32/64 位 | 支持 | Python capa 9.4.0, `sc32`/`sc64` | | capa freeze 文件 | 支持 | Python capa 9.4.0 | | Mach-O x86_64/arm64/arm64e(精简或胖二进制,`-f macho`) | 支持 —— **capa-x 扩展** | 无 Python oracle;见下文 | | IDA, Ghidra, Binary Ninja, BinExport | 非目标 | 原生输入才是重点 | 不支持的输入绝不会被静默接受或进行部分分析。 锁定的 capa 9.4.0 根本不接受 Mach-O 作为原始输入,因此 `-f macho` 是一个有文档记录的 capa-x 扩展,而不是一致性声明:它绝不会 被 `-f auto` 选中(该选项完全镜像了上游自有的 PE/ELF/freeze 检测 顺序),必须显式请求。capa 的特性语义 仍然支配着特性的含义;精简和胖(`--arch` 选择一个切片, `auto` 接受胖头顺序中第一个支持的切片)x86_64、`arm64` 和 `arm64e` Mach-O 均受支持。 原生 AArch64 解码、恢复和特征提取(基于 `disarm64`, 运行时无需 Ghidra/IDA/Binary Ninja/BinExport)涵盖了 ELF、Mach-O 和 PE —— 相同的解码器和恢复核心,与每种容器 格式的现有加载器相结合。锁定的 capa 9.4.0 完全没有原始 AArch64 输入 (它自身的 AArch64 支持仅限 BinExport2),因此 AArch64 PE 和 Mach-O 带有 与 x86_64 Mach-O 相同的“capa-x 扩展,无 Python oracle”的注意事项; AArch64 ELF 则基于锁定的 Ghidra BinExport2 固件语料库进行验证, 结果记录在兼容性证据中。 CLR PE 会被自动检测,并优先路由至 `.NET` 后端,而不是原生 x86 提取器(`-f pe` 会覆盖此行为并强制走 x86 路径,而 `-f dotnet` 会强制走 `.NET` 路径)。混合模式程序集(一个二进制文件中包含 托管 + 非托管代码)仅分析其托管方法 —— 不存在进入原生部分的跨 runtime 调用图,这符合 上游 capa 自身的 `dnfile` 提取器行为。该文件带有“混合模式” 特性特征,并且混合模式程序集在其他方面的检测和 分析与完全托管的程序集相同。 ## 兼容性矩阵 上表按格式列出了所有输入;而下表将相同的输入 按 *capa-x 对它们作出的声明类型* 进行分组 —— 忽略这种 区别正是移植项目过度声明的开端。 | 类别 | 成员 | Oracle | |---|---|---| | 上游一致性原始输入 | PE, ELF, shellcode (x86/x64), .NET/CLR | 直接与 Python capa 9.4.0 比较,记录在 `docs/BENCHMARKS.md` | | 跨后端一致性 | AArch64 ELF | 无原始 AArch64 的 Python oracle;基于锁定的 Ghidra BinExport2 进行特性和规则级比较,方法见 [docs/BENCHMARKS.md](docs/BENCHMARKS.md) | | capa-x 扩展 | Mach-O (x86_64, AArch64), AArch64 PE | 完全没有 Python oracle —— 锁定的 capa 9.4.0 没有原始 Mach-O 或 AArch64 输入;基于手动构建的结构/特性固件语料库进行验证(见 [docs/BENCHMARKS.md](docs/BENCHMARKS.md)),从不声称与上游一致 | | 已接受的差异 / 非目标 | Vivisect 绑定的恢复缺口,其他 ISA,实时动态提取器 | [`KNOWN_DIVERGENCES.md`](KNOWN_DIVERGENCES.md)(13 个已查明根本原因的类别) | ## 安装 从 [GitHub Releases](https://github.com/Karib0u/capa-x/releases) 下载归档文件,解压, 然后运行: ``` ./capa-x sample.exe ./capa-x -j sample.exe ``` 发布归档文件包含锁定的规则。在源码检出中,规则 位于 `./rules`。对于其他目录结构,请将 `rules/` 放在二进制文件旁,通过 `--rules` 传入,或设置环境变量 `CAPA_RULES_DIR`。 ## 快速开始 ``` # 人类可读的结果 capa-x sample.exe # Canonical JSON 结果文档 capa-x -j sample.exe # .NET / CLR 托管 PE(自动检测;-f dotnet 强制启用) capa-x sample.exe capa-x -f dotnet sample.exe # 原始 shellcode capa-x -f sc32 shellcode.bin capa-x -f sc64 shellcode.bin # 冻结输入 capa-x -f freeze sample.frz # 显式并行 capa-x --jobs 4 sample.exe ``` 运行 `capa-x --help` 以查看架构和操作系统覆盖、标签过滤、自定义 签名、详细程度以及输出选项。 分析过程不会执行任何网络访问。规则仅通过 显式命令下载: ``` capa-x fetch-rules ./rules ``` ## 从源码构建 需要 Rust 1.87 或更高版本。 ``` git clone https://github.com/Karib0u/capa-x.git cd capa-x git submodule update --init --depth 1 rules cargo build --release target/release/capa-x --version ``` 庞大的测试语料库和 Python 参考子模块仅在 差异开发时需要。`scripts/setup_dev.sh` 会安装该环境。 ## Python 绑定 [`capa-x-python/`](capa-x-python/) 是基于相同的 分析代码构建的进程内 Python 扩展 —— 无需子进程,分析时无需 Python, 也没有任何重新实现。使用 [maturin](https://www.maturin.rs/) 在本地构建它: ``` pip install maturin cd capa-x-python maturin develop --release ``` ``` import capa_x rules = capa_x.Rules.from_directory("rules") # parse + validate once result = capa_x.analyze("sample.exe", rules) # load once, scan many print(sorted(result["rules"].keys())) ``` `analyze()` 返回上游 capa 自身的 `ResultDocument` schema 作为纯 `dict` —— 与 `capa-x -j` 打印的形状相同,也与 `capa.render.result_document.ResultDocument.model_validate_json` 接受的 未修改形状一致(见 [`capa-x-python/README.md`](capa-x-python/README.md))。预构建的 wheels(linux x86_64/aarch64,macOS x86_64/arm64,Windows x86_64)由 [`release.yml`](.github/workflows/release.yml) 在每次打标签时构建;每次推送 都会进行一次成本更低的仅限 linux 的构建以及相同的 schema 验证检查。 ## 准确性与局限性 针对发布树与 Python capa 9.4.0 及 锁定规则进行差异运行: | 指标 | 结果 | |---|---:| | 规则级一致性 | **98.55%** | | 匹配参考的规则 | 6,263 | | 差异规则 | 91:缺失 61 个,多出 30 个 | | 具有相同规则集的样本 | 161/200 (80.5%) | 规则级一致性处于领先地位,因为它衡量的是单个能力规则。 每一个测量到的差异都映射到了记录在案的根本原因。具体方法、 跨实现覆盖率、性能表以及复现命令 位于 [docs/BENCHMARKS.md](docs/BENCHMARKS.md)。 在受控的结果等价样本上,在五次测量运行中,capa-x 的中位数时间为 0.959 秒,Python capa 9.4.0 为 3.007 秒。在 10 个样本的并行语料库上,一个任务的总运行时间为 77.374 秒,使用默认 10 个任务时为 37.199 秒,每个样本的中位数加速比为 2.03 倍,最差的样本为 1.52 倍。这些是在配备 macOS 26.6 和 10 个逻辑 CPU 的 MacBook Pro M1 Max 上测量的结果,并非通用的 性能声明。 从 Python capa 迁移的用户偶尔会遇到 capa 匹配了某条规则,但 capa-x 却没有的情况;每一个已知案例都被编目在 [KNOWN_DIVERGENCES.md](KNOWN_DIVERGENCES.md) 中,且大多数受限于模拟器。 capa-x 尽最大努力跟踪上游 capa 版本;目前 锁定在 9.4.0,并且在锁定版本变更前,每一个受支持的上游版本都会使用 完整的差异测试套件进行重新验证。本项目由个人维护, 因此审查和安全响应时间均属尽力而为。 与之前的 Rust 移植不同,每一个结果都针对锁定的 Python capa 9.4.0 进行了差异测试:上述的规则级一致性涵盖了 200 个样本的语料库, 每一个差异规则都在 [KNOWN_DIVERGENCES.md](KNOWN_DIVERGENCES.md) 中单独查明根本原因。如果无法被测量,就 不作声明。 ## 复现证据 ``` scripts/setup_dev.sh cargo build --release cargo test --workspace cargo fmt --all -- --check cargo clippy --workspace --all-targets -- -D warnings python3 scripts/difftest.py --mode full \ --samples scripts/corpus-outer.txt --capa-cli target/release/capa-x \ --no-rust-cache python3 scripts/determinism.py \ --samples scripts/corpus-jobs.txt --capa-cli target/release/capa-x python3 scripts/bench.py \ --samples scripts/corpus-bench.txt --markdown ``` ## 文档与社区 - [架构](docs/ARCHITECTURE.md) - [设计决策](docs/decisions/) - [准确性与性能方法论](docs/BENCHMARKS.md) - [已知后端差异](KNOWN_DIVERGENCES.md) - [锁定的上游版本](PINNED.md) - [发布历史](CHANGELOG.md) - [贡献](CONTRIBUTING.md) - [安全政策](SECURITY.md) - [行为准则](CODE_OF_CONDUCT.md) 这是一个独立的实现,不隶属于 Google LLC 或 Mandiant, Inc., 也未获得其认可。有关归属和 派生记录,请参阅 [NOTICE](NOTICE)。 基于 [Apache License 2.0](LICENSE) 授权。
标签:DAST, Rust, 云安全监控, 云计算, 云资产清单, 可视化界面, 威胁情报, 开发者工具, 恶意软件分析, 网络流量审计, 规则引擎, 逆向工具, 逆向工程, 通知系统, 静态分析