boredchilada/capa-java

GitHub: boredchilada/capa-java

一款纯 Python 标准库实现的 Java 恶意软件能力标签分诊工具,通过 API 和字符串签名快速识别 JAR 或反编译源码中各类展示出的恶意能力。

Stars: 0 | Forks: 0

# capa-java 一款轻量级的 Java 恶意软件能力标签工具 —— JVM 平台上的“capa-lite”。 [Mandiant 的 capa](https://github.com/mandiant/capa) 非常出色,但它**不**支持 Java 字节码(它处理 PE、ELF、.NET、shellcode 和沙箱痕迹 —— 不支持 `.class` / JAR 文件)。`capa-java` 填补了这一空白:它对样本运行一套 Java API 和字符串签名的规则集,并告诉你哪个类展示了何种能力。 它是一个**辅助分诊工具** —— 基于启发式判断,而非绝对证据。它能快速为你指出值得关注的类;你需要通过阅读引用的代码行来确认匹配结果。 ## 为什么它很有用 - **无依赖。** 纯 Python 标准库。克隆即可运行。 - **两种输入模式。** 可以将其指向反编译后的 `.java` 源代码树(结果最丰富),或者直接指向 `.jar` 文件 —— 在 JAR 模式下,它会从每个 `.class` 的常量池中读取可打印字符串,因此你甚至不需要先进行反编译。 - **抵御字符串混淆。** 恶意软件可以加密字符串*字面量*(`"Login Data"`、`schtasks`),但它无法隐藏 API/类型引用(`java.awt.Robot`、`Cipher.getInstance`、`com.sun.jna...`)—— 这些必须保留在常量池中以便链接。每条规则都标记为 `api`(可抵御混淆)或 `str`(不可抵御),因此你知道应该对每个匹配结果给予多少信任。 - **MITRE 风格的能力名称。** `persistence/scheduled-task`、`creds/browser-chromium`、`c2/reverse-shell`、`collection/keylogging`,以及其他约 50 种。 ## 安装 ``` git clone https://github.com/boredchilada/capa-java.git cd capa-java ``` 要求 Python 3.8+。无需 `pip install`。 ## 用法 ``` # 在反编译的 .java tree(信息最丰富)上运行,或直接在 .jar 上运行 python3 java_capa.py # 显示匹配的 string + kind (api/str) 以及每个 class 的 notable imports python3 java_capa.py --evidence --imports # 仅列出具有至少 N 项 capabilities 的 classes python3 java_capa.py --min 3 ``` | 标志 | 效果 | |------|--------| | `--evidence` | 显示每个能力的示例匹配、其类型(`api`/`str`)以及 `class:line` | | `--imports` | 列出每个类的重要 API 导入(即可抵御混淆的信号) | | `--min N` | 仅打印具有 `>= N` 个能力的类 | ## 输出 三个部分: 1. **摘要** —— 扫描的类、具有能力的类的数量、观察到的不同能力。 2. **类 → 能力** —— 每个被标记的类,按能力数量排序,并根据需要提供证据和导入信息。 3. **能力 → 类** —— 反向索引,因此你可以直接跳转到“哪些类执行了持久化操作?” 有关针对 STRRAT 样本的实际输出,请参阅 [`examples/strrat-sample-output.txt`](examples/strrat-sample-output.txt)。 ## 工作原理 对于每个单元(`.java` 文件或 `.class` 条目),该工具会构建原始文本以及一份斜杠→点号格式的规范化副本,因此像 `java/awt/Robot` 这样的 `.class` 引用也能匹配点分 API 模式,同时像 `cmd /c` 这样的原始形式保持不变。每种能力都是一组 `(kind, regex)` 对;第一个匹配的结果生效,并会记录其行号。 ## 扩展规则 整个规则集就是 [`java_capa.py`](java_capa.py) 顶部的 `RULES` 字典。像这样添加一种能力或签名: ``` RULES = { # ... "persistence/scheduled-task": [ ("str", r"schtasks"), # literal string — defeated by obfuscation ("str", r"/sc minute"), ], "crypto/cipher": [ ("api", r"Cipher\.getInstance"), # API ref — survives obfuscation ("api", r"AES/"), ], } ``` `api` 规则针对导入的 API/类型,并且能够抵御字符串字面量混淆;`str` 规则针对字面字符串,不能抵御混淆。模式是大小写不敏感的正则表达式。 ## 局限性 - 设计上基于启发式 —— 预期会出现误报和漏报。务必通过阅读引用的类和代码行来确认匹配结果。 - 在 JAR 模式下,“行号”是按类字符串转储中的索引,而不是源代码行号。如需真实的源代码行号,请进行反编译。 - 目前的规则主要针对针对 Windows 平台的常见 Java RAT/窃密木马。 ## 安全 该工具仅**读取**样本(字符串提取和正则表达式匹配)—— 它从不执行任何操作。话虽如此,输入的是真实的恶意软件:请在隔离的虚拟机中分析它们,并且切勿将真实样本提交到代码仓库中(参见 `.gitignore`)。 ## 许可证 [MIT](LICENSE)
标签:DAST, GHAS, Java安全, JS文件枚举, Python, 云安全监控, 云资产清单, 威胁情报, 开发者工具, 恶意软件分析, 无后门, 逆向工具, 逆向工程, 静态分析