Java 類文件採用標準化位元碼格式,理論上可 100% 還原邏輯。本文回顧反編譯工具演進史,解析位元碼結構,推薦現代去混淆工具鏈,並說明法律/道德邊界。
| 年代 | 工具 | 特點 | 現狀 |
|---|---|---|---|
| 1996 | javap (JDK 內建) | 僅顯示簽名/位元碼助記符,不可還原 Java 代碼 | 仍內建,適合快速檢視 |
| 1998 | Mocha (H.P. van Vliet) | 首個可還原 Java 源碼的自由軟體,作者早逝 | 停止維護,歷史意義 |
| 2001 | JAD (Java Decompiler) | C++ 編寫、速度快、支援 1.4 語法 | 2006 停更,不支援泛型/Enum/Lambda |
| 2005 | JD-GUI (基於 JD-Core) | 圖形介面、支援 Java 5/6/7、插件化 | 2015 後更新緩慢,Java 8+ 支援不全 |
| 2011 | CFR (Class File Reader) | 純 Java、支援 Java 8-17、處理 Lambda/MethodRef 較好 | 活躍維護,命令列/庫雙模式 |
| 2013 | Fernflower (JetBrains) | IntelliJ 內建、結構化去混淆、支援 Java 8-21 | IntelliJ 內建版持續更新,開源版較舊 |
| 2015 | Procyon | 支援 Java 8+、模組化、輸出可編譯代碼 | 活躍,適合 CI/CD 整合 |
| 2020 | Vineflower (Fernflower 分支) | 現代化重構、更好泛型還原、Kotlin 交叉支援 | 最推薦開源選擇 |
# Vineflower (推薦)
java -jar vineflower.jar -dgs=1 -dind=1 -din=1 -dln=1 -doc=1 -drt=1 -log=WARN -o out_dir target.jar
# CFR
java -jar cfr.jar --outputdir out_dir --caseinsensitivefs true target.jar
-dgs=1 還原泛型簽名 (Signature 屬性)-dind=1 還原內部類結構-din=1 使用 LocalVariableTable 還原參數名-dln=1 使用 LineNumberTable 還原行號exports 僅公開必要包。