程式碼混淆的問題

程式碼混淆是最早應用於 Java 程式碼保護的方案,也是最直接的方案。

程式碼混淆通常包含以下四種方法:

  1. 套件名稱、類別名稱、變數名稱轉換
  2. 控制結構變更,例如控制流程平坦化、新增不可變謂詞等
  3. 字串混淆或加密
  4. 新增無用程式碼

程式碼混淆可以顯著降低反編譯程式碼的可讀性,增加靜態分析的難度,但無論如何進行程式碼混淆,程式的執行邏輯都不會被改變。

JVM 位元組碼是一種非常清晰且語義明確的中間碼,具有極高的可讀性。對於經過混淆的 class 檔案,即使無法還原為可讀的 Java 原始碼,仍然可以在位元組碼層級進行分析。由於 Java 位元組碼的高語義特性,這個過程實際上相對容易。

我們使用 Java 和 Kotlin 語言開發了一個 JVM 位元組碼執行引擎。使用者可以使用此專案在 IntelliJ IDEA 中以位元組碼層級動態除錯 Java 程式。更多資訊請參閱以下文章。

https://protector4j.com/zh-tw/articles/jvm-bytecode-engine-written-with-java-and-kotlin/

我們使用此引擎嘗試破解一個知名的混淆程式碼,具體過程可參考以下文章

http://protector4j.com/zh-tw/articles/deobfuscate-with-vlx-vmengine/

結論

從上述分析可以看出,由於 JVM 位元組碼的高語義特性,非常容易被分析和閱讀。透過動態除錯可以輕鬆分析其執行邏輯。編寫動態除錯工具並不是一項非常複雜的任務,因此混淆並不是一個可靠的保護方案。