AOT 编译的问题

AOT 编译将 Java 代码转换为本地代码,显著提高了 Java 程序的运行速度。它通过将代码转换为机器码来间接实现保护 Java 代码的目的。

对于 Java 程序,尤其是基于各种框架的程序,由于包含大量动态特性,AOT 编译是一个巨大的挑战。同时,为了兼容动态性,编译后的二进制文件可能仍然包含大量的 class 文件信息。以下文章介绍了一个扫描编译后二进制文件以获取类信息的项目。 https://protector4j.com/zh/articles/extract-java-classes-information-from-aot/

即使二进制程序不包含 class 文件信息,其运行逻辑仍然以同样的方式存在。唯一的区别是表示形式从字节码变为了机器码,没有任何特殊保护。如果能够理解其编译和执行机制,仍然可以逆向工程还原出可读代码。以下文章介绍了这样一个项目。 https://protector4j.com/zh/articles/graalvm-nativeimage-reverse-engineering/

结论

AOT 编译配置困难,编译难度大,编译失败的概率高。即使编译成功,代码逻辑也只是从字节码表示变为机器码表示。其固有的运行逻辑仍然存在,没有任何特殊保护。如果能够理解其自身的编译和执行机制,仍然可以逆向工程还原出可读代码。