Java 編譯產出的 .class 檔案保留豐富元資料(類名、方法名、變數名、行號、泛型簽名),極易被反編譯還原為可讀源碼。保護知識產權,必須:
| 工具 | 特點 | 授權/平台 |
|---|---|---|
| JAD | Windows 下經典、效果極佳的 C++ 實現,支援 JDK 1.5- 語法。配合 JADClipse (Eclipse 外掛) 或 FrontEnd (GUI) 體驗最佳。 | 免費/Win |
| JODE | 純 Java 實現,兼具反編譯與位元組碼優化。可作為庫嵌入工具鏈。 | 開源/跨平台 |
| Intr@byte | JBuilder OpenTool 外掛,基於 JAD 引擎,直接在 IDE 開啟 .class 檔,僅顯示類定義部分。 | 免費/JBuilder |
| 在線反編譯 | 上傳 JAR/Class 或給 URL,自動分析 Applet 並反編譯。jreveal.org | 免費/Web |
| CFR / Fernflower / Procyon | 現代主流工具,完美支援 Java 8+ (Lambda、Stream、模組)、Kotlin、Scala 字節碼。IntelliJ 內建即基於 Fernflower。 | 開源/跨平台 |
核心手段:語義保持下的標識符重命名 + 控制流扁平化 + 字串加密。
// 原始碼
package temp;
public class HelloWorld {
String helloWorld = "Hello World";
String byeWorld = "Bye World";
public void say(boolean happy) { System.out.println(happy ? helloWorld : byeWorld); }
}
// 反編譯後 (包/類/方法/欄位 全單字母)
package a;
public class a { String a, b; public void a(boolean flag) { System.out.println(flag ? a : b); } }
效果:阻礙閱讀理解,但邏輯結構、字串常量、控制流完整保留。
// 反編譯後 (偽代碼風格)
public class a {
String a = decrypt("q\0041\033/\03162\005,]"); // "Hello World"
String b = decrypt("{\0308W\027V\0231\023"); // "Bye World"
public void a(boolean flag) {
if (!flag) goto L1; else goto L2; // 控制流扁平化,去結構化
L1: System.out.println(a); goto L3;
L2: System.out.println(b);
L3: return;
}
private static String decrypt(String s) { ... } // 解密邏輯內嵌
}
效果:大幅增加靜態分析難度,動態調試仍可還原(JVM 執行時必須解密)。
| 工具 | 特色 | 適用場景 |
|---|---|---|
| ProGuard | 免費、開源、Gradle/Maven 內建、支援縮減、優化、預驗證。Android 專案預設整合。 | 通用 Java/Android 專案,基礎~中階防護 |
| Zelix KlassMaster | 商業、強大控制流混淆、字串加密、資源加密、增量擾碼、腳本化配置。 | 高價值桌面/伺服端應用,需強防護 |
| Allatori | 商業、水印、動態類載入保護、原生庫綁定。 | 企業級授權保護 |
| DashO (PreEmptive) | 商業、運行時完整性檢測、防調試、遙測分析。 | 金融/醫療/軍工合規要求 |
.class/JAR。-obfuscate),產出擾碼後 JAR。「擾碼提高逆向成本,無法達到絕對防護。核心演算法建議採用原生庫 (JNI) 或伺服端化,配合法律手段(授權協議、版權登記)構建纵深防禦體系。」