AOT 編譯的問題

AOT 編譯將 Java 程式碼轉譯為原生程式碼,顯著提高 Java 程式的執行速度。它透過將程式碼轉換為機器碼間接達到保護 Java 程式碼的目的。

對於 Java 程式,尤其是基於各種框架的程式,由於包含許多動態特性,AOT 編譯是一個巨大的挑戰。同時,為了妥協於動態性,編譯後的二進位檔案可能仍然包含大量的 class 檔案資訊。以下文章介紹了一個掃描編譯後二進位檔案以獲取類別資訊的專案。 https://protector4j.com/zh-tw/articles/extract-java-classes-information-from-aot/

即使二進位程式不包含 class 檔案資訊,其執行邏輯仍然以相同方式存在。唯一的區別是表示方式從位元組碼變為機器碼,沒有任何特殊保護。如果能夠理解其編譯和執行機制,仍然可以逆向工程出可讀的程式碼。以下文章介紹了這樣一個專案。 https://protector4j.com/zh-tw/articles/graalvm-nativeimage-reverse-engineering/

結論

AOT 編譯配置困難,編譯難度高,編譯失敗的機率也高。即使編譯成功,程式碼邏輯也只是從位元組碼表示轉變為機器碼表示。其固有的執行邏輯仍然存在,沒有任何特殊保護。如果能夠理解其自身的編譯和執行機制,仍然可以逆向工程出可讀的程式碼。