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, 云安全监控, 云资产清单, 威胁情报, 开发者工具, 恶意软件分析, 无后门, 逆向工具, 逆向工程, 静态分析