vcth4nh/decaf
GitHub: vcth4nh/decaf
一款集成五大引擎并支持 Maven 源码优先策略的 Java 批量反编译命令行工具。
Stars: 0 | Forks: 0
# decaf
一体化的 Java 反编译 CLI。将其指向一个文件夹;它会将其找到的每一个
`.jar` / `.war` / `.ear` / `.aar` / 松散的 `.class`(包括嵌套在归档文件中的归档
——默认深入一层,使用 `--max-depth` 可更改)反编译成一个镜像你输入结构的源码树,
或者使用 `--merge` 合并成一个单一的包树。
- **源码优先:** 能够解析为 Maven GAV 的产物(内嵌的
`pom.properties`,或在 Maven Central 上进行 SHA-1 查询)会下载其真实的
`-sources.jar`,而不是进行反编译。
- **五大引擎,自动回退:** Vineflower → CFR →
Procyon → Fernflower → JD-CLI。如果某个引擎崩溃、超时或遗漏了类,
下一个引擎将接管(支持整个归档和每个类的重试)。
- **引擎自动下载:** 首次使用时(固定版本,经过 sha256 验证)
下载到你的用户缓存目录中。
## 环境要求
- Python 3.11+ 和 [uv](https://docs.astral.sh/uv/)
- PATH 中包含 Java 11+(Java 21+ 可启用所有五个引擎;Vineflower 需要 17+,
Fernflower 需要 21+)
- Linux、macOS 或 Windows(CPU 预算在 Linux 上是强制执行的,
在其他平台上仅作为提示)
## 安装
```
uv tool install . # from a checkout → `decaf` on PATH
# 或者无需安装直接运行:
uvx --from . decaf --help
```
## 用法
```
decaf ./libs # one folder per archive under ./decaf-out
decaf app.war -o out --merge # single merged source tree in out/src
decaf ./libs --engine cfr --no-fallback
decaf ./libs --no-maven -j 8 --timeout 120
decaf ./libs --cpus 8 # cap total CPU (shared machine)
decaf ./libs --max-depth 2 # also unpack jars nested two archives deep
decaf ./libs --repo https://nexus.mycorp.com/repository/maven-public
```
退出代码:`0` 所有产物成功 · `1` 部分失败(参见
`decaf-out/decaf-report.json`) · `2` 用法/环境错误。
归档嵌套深度由 `--max-depth` 限制(默认为 1:会处理 war 或 fat jar 中的 jar,
但不会处理这些 jar 内部的 jar)。更深层级的归档将在报告中列为已跳过。文件夹的递归深度则从不受限。
CPU 使用受到预算控制。在 Linux 上,该预算通过 CPU 亲和性强制执行:
decaf 会将自身绑定到前 `cpus` 个核心,并且每个引擎的 JVM 都会继承该掩码,
因此机器的其余部分保持真正的空闲。每个 JVM 在启动时也会带上
`-XX:ActiveProcessorCount = cpus ÷ jobs` 来调整其线程
池的大小(在其他平台上,此提示是唯一的限制)。默认预算
是所有核心数减一,以确保机器在长时间运行期间保持响应;
`--cpus N` 可对其进行精确设置(例如,设置为你的完整核心数以使用所有资源)。
Worker 的数量会被限制,因此它们永远不会超过预算。
## 输出布局
**镜像(默认):** 输出会镜像输入树,每个归档文件对应一个目录,
包含其完整的引擎输出(含 resources):
`in/libs/app.war` → `out/libs/app.war/WEB-INF/lib/dep.jar/`。
**合并(`--merge`):** 每个产物的 `.java` 文件会按包合并到
`OUTPUT/src/` 中 —— 随时可在 IDE 中打开。重复的类会被去重;
冲突的重复项采用先到先得原则(由输入路径顺序决定确定性)
并记录在报告中。诸如 `WEB-INF/classes/` 之类的容器前缀
会被剔除。Resources 会被跳过(在报告中计数)。
## 配置
`~/.config/decaf/config.toml`(或 `--config PATH`):
```
# Maven repositories,按顺序尝试。
# 除非显式列出,否则会自动附加 Maven Central。
repositories = [
"https://nexus.mycorp.com/repository/maven-public",
"https://user:pass@private.repo/maven2", # basic auth via URL userinfo
]
```
`--repo URL`(可重复使用)会前置临时仓库。SHA-1 查询仅限于
Central;由 Maven 构建的 jar 几乎总是内嵌 `pom.properties`,
这适用于任何仓库。
## 引擎
| 引擎 | 版本 | 最低 Java 版本 |
|---|---|---|
| [Vineflower](https://github.com/Vineflower/vineflower) | 1.12.0 | 17 |
| [CFR](https://github.com/leibnitz27/cfr) | 0.152 | 11 |
| [Procyon](https://github.com/mstrobel/procyon) | 0.6.0 | 11 |
| Fernflower (JetBrains `java-decompiler-engine`) | 253.33813.25 | 21 |
| [JD-CLI](https://github.com/intoolswetrust/jd-cli) | 1.2.0 | 11 |
## 开发
```
uv sync
uv run pytest # fast offline suite
uv run pytest -m "slow or network" # + real-engine and live-Maven integration
```
标签:Java反编译, JS文件枚举, Maven, SOC Prime, 云资产清单, 代码分析, 凭证管理, 开发工具, 漏洞验证, 逆向工具, 逆向工程