Java Class 檔案加密的問題

除了混淆之外,class 檔案加密是一種容易想到的程式碼保護方法。許多方案採用代理來加密 class 檔案並在類別載入時進行解密。然而,這些方案忽略了一個重要的點——JVM 內建的附加機制。

JVM 附加機制

為了方便分析和監控程式執行,普通 JVM 內建了附加功能。使用者可以使用 jhsdb 等工具附加到 JVM 程序,查看和分析其記憶體資料。而且,這些記憶體資料是根據原始檔案中的資料結構妥善組織的,也可以理解為 JVM 的內建後門機制。

以下文章介紹了如何使用 JVM 附加機制來讀取和儲存記憶體中的 class 檔案資訊。

https://protector4j.com/zh-tw/articles/cracking-encrypted-java-applications-jhsdb/

除了使用 JDK 提供的 jhsdb 工具外,您也可以使用阿里巴巴的 Arthas 來分析正在執行的 Java 程序。

透過 HOOK 相關函式取得動態載入的類別資訊

某些保護方法透過反射動態載入類別資訊,這種方式也可以透過 DLL 注入來取得即時載入的類別資訊。更多詳情請參閱以下兩個專案。

https://github.com/ViRb3/jvm-dump-proxy

https://github.com/zorftw/JVM-Native-Classdumping

結論

由於 JVM 附加機制或二進位 HOOK 機制的存在,所有未脫離正常 JVM 執行的所謂加密程式碼都可以透過附加工具輕鬆讀取或透過 DLL 注入進行攔截。因此,這是最無效的保護方案。