marirs/capa-rs

GitHub: marirs/capa-rs

Mandiant capa 的 Rust 移植版,用于静态提取多格式可执行文件的行为能力与安全特性。

Stars: 18 | Forks: 4

# capa-rs — 文件能力提取器 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/marirs/capa-rs/actions/workflows/ci.yml) [![Crates.io](https://img.shields.io/crates/v/capa.svg)](https://crates.io/crates/capa) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![MSRV](https://img.shields.io/badge/MSRV-1.95-blue.svg)](#requirements) 在线试用: `capa-rs` 可检测可执行文件中的能力。将其指向 PE、ELF、Mach-O、.NET 二进制文件或原始 shellcode,它就会告诉你该程序能做什么——例如,该文件是一个后门、安装 Windows 服务、通过 HTTP 进行通信,或者使用 RC4。它还会运行二进制安全检查清单(PE:ASLR、NX、stack canary、CFG、SafeSEH、App-Container 等;ELF:ASLR、immediate-bind、RELRO、stack-prot;Mach-O:PIE、NX、stack-canary、restrict、code-signature、hardened-runtime、allow-JIT、two-level-namespace、no-undef-syms)。 支持的输入:跨 **x86、x86_64、AArch64** 架构的 **PE / .NET / ELF / Mach-O**(thin 和 fat / universal)——运行在 Windows / Linux / macOS / iOS 目标平台上。 这是 Mandiant 的 [Python capa](https://github.com/mandiant/capa) 的 Rust 移植版,不包含 IDA / Ghidra 插件——它是一个纯粹用于生成能力报告的库。内置的 `capa_cli` 示例将其封装为了一个命令行工具。规则来自于官方的 [capa-rules](https://github.com/mandiant/capa-rules) 仓库。 ## 快速开始 ``` [dependencies] capa = "0.5" ``` ``` use capa::{BinarySecurityCheckOptions, FileCapabilities}; fn main() -> Result<(), Box> { let mut fc = FileCapabilities::analyze() .rules("path/to/capa-rules") .high_accuracy(true) .resolve_tailcalls(true) .security_checks(BinarySecurityCheckOptions::default()) .from_file("Sample.exe")?; let json = fc.serialize_file_capabilities(None)?; println!("{}", json); Ok(()) } ``` `.rules(...)` 是唯一必需的 setter。所有其他的 builder 方法默认均为关闭 / 空操作——大多数调用者只需要用到其中几个。 ## CLI 示例 ``` $ capa_cli --rules-path capa-rules data/Demo64.dll +--------------+-------------+ | File Properties | +==============+=============+ | arch | AMD64 | +--------------+-------------+ | base_address | 0x180000000 | +--------------+-------------+ | format | PE | +--------------+-------------+ | os | WINDOWS | +--------------+-------------+ +-----------------------+-------------+ | Security Checks | +=======================+=============+ | ASLR | Supported | | CHECKSUM | Fail | | CONTROL-FLOW-GUARD | Unsupported | | DATA-EXEC-PREVENT | Pass | | SAFE-SEH | Pass | | VERIFY-DIGITAL-CERT | Fail | +-----------------------+-------------+ +---------------+------------------------+ | ATT&CK Tactic | ATT&CK Technique | +===============+========================+ | Execution | Shared Modules [T1129] | +---------------+------------------------+ +----------------------------------+-------------------------------------------------+ | Capability | Namespace | +----------------------------------+-------------------------------------------------+ | check for software breakpoints | anti-analysis/anti-debugging/debugger-detection | | contains PDB path | executable/pe/pdb | | hash data using djb2 | data-manipulation/hashing/djb2 | | match known PlugX module | malware-family/plugx | +----------------------------------+-------------------------------------------------+ TAGS: [B0001.025, C0030.001, C0030.006, T1129] ``` 详细模式会添加按函数划分的 feature 及能力表格: ``` capa_cli --rules-path capa-rules --verbose data/Demo64.dll ``` ## Shellcode / 原始缓冲区分析 对于没有 PE/ELF/Mach-O 头的载荷(payload)——如 shellcode、脱壳后的模块、内存转储(memory dumps)——请使用 builder 的 `.from_buffer(...)` 终端,而不是 `.from_file(...)`: ``` use capa::FileCapabilities; let shellcode = std::fs::read("payload.bin")?; let fc = FileCapabilities::analyze() .rules("path/to/capa-rules") .high_accuracy(true) .resolve_tailcalls(true) .from_buffer(&shellcode, 0x1000, 64)?; // base_addr, bitness ``` 该 shellcode 会被视为映射在 `base_addr` 处的单一 section。dnfile 和安全检查 pipeline 将被跳过(因为没有 PE/ELF 头可供检查)。 ## PDB 元数据(符号服务器查找) 对于带有 CodeView 调试记录的 PE 输入,`FileCapabilities.properties` 会公开 `pdb_guid`、`pdb_age` 和 `pdb_filename`——这些正是 Microsoft SymSrv / Mozilla / Chromium 符号存储所查找的键。当输入没有调试目录或不是 PE 时,JSON 输出中会省略这些字段。 ## FLIRT 库函数识别 将 `.signatures(path)` 指向一个包含 `.sig` / `.pat` 文件的目录,匹配到的库函数(MSVC CRT、ATL/MFC、OpenSSL、zlib、boost、libcurl、lua、protobuf、DirectX、Intel 库等)将被排除在能力输出之外。 ``` let fc = FileCapabilities::analyze() .rules("path/to/capa-rules") .signatures("path/to/flirt-sigs") .from_file("Sample.exe")?; ``` ``` capa_cli --rules-path capa-rules --signatures flirt-sigs Sample.exe ``` 本仓库附带了一个 `flirt-sigs/` 目录,其中包含 195 个来源于 [Mandiant FLARE](https://github.com/mandiant/capa/tree/master/sigs) 和 [Maktm's FLIRTDB](https://github.com/Maktm/FLIRTDB) 的签名。GitHub releases 中也以 `flirt-sigs-vX.Y.Z.tar.gz` 产物(artifact)的形式提供了相同的内容。 ## 功能 该 crate 附带两个 cargo feature: - `properties` *(默认)* — `FileCapabilities` 上的文件元数据(架构、基址、格式、OS)。 - `verbose` — `FileCapabilities` 上按函数划分的 feature / 能力明细。 构建组合: ``` cargo build # default = properties cargo build --features verbose # verbose only cargo build --features verbose,properties # both ``` ## 环境要求 - Rust **1.95** 或更高版本(2024 edition)。 ## 该生态系统中的相关 crate - [`smda`](https://crates.io/crates/smda) — 递归式 **x86 / x86_64 / AArch64** 反汇编器(零拷贝,iced-x86 + disarm64 后端)。包含 PE / ELF / Mach-O 加载器,通过 bind-opcode stream + `LC_DYSYMTAB` stub walker 实现完整的 Mach-O API 解析。 - [`dnfile`](https://crates.io/crates/dnfile) — .NET CLR 元数据解析器(零拷贝)。 - [`fast-flirt`](https://crates.io/crates/fast-flirt) — 纯 Rust 实现的 FLIRT(`.sig` / `.pat`)签名匹配器。始终链接至 capa-rs;仅在你传递 `--signatures` 时才会执行工作。 ## 许可证 Apache-2.0 — 详见 [`LICENSE`](LICENSE)。
标签:DAST, Rust, 二进制分析, 云安全运维, 云资产清单, 可视化界面, 恶意软件分析, 网络流量审计, 逆向工程, 通知系统