AOT编译存在的问题

AOT编译即将Java代码编码为本地代码,不仅大大提高了Java程序的运行速度,而且由于将Java代码转换为机器代码,因此也间接达到了保护Java代码的目的。

对于Java程序来说,特别对于基于各类框架的Java程序,由于包含了许多动态特性,进行AOT编译是一个巨大的挑战,同时为了向动态性做出妥协,编译完成后的二进制文件中仍然可能包含大量类文件信息。下面这篇文章即介绍了一个项目,通过扫描编译好的二进制文件获取到类信息 https://protector4j.com/articles/extract-java-classes-information-from-aot/

即使二进制程序中不包含类文件信息,但是其运行逻辑仍然是同样存在的,只不过表示形式由原来的字节码表示转换为机器代码表示,并没有进行特别的保护,如果能够了解其本身的编译与运行机制,仍然能够逆向还原出可读性的代码。下面这篇文章即介绍了这样一个项目

https://protector4j.com/articles/graalvm-nativeimage-reverse-engineering/

结论

AOT编译配置难度大,编译难度大,编译失败概率高,即使编译成功,代码逻辑也仅是由原来的字节码表示转换为机器代码表示,其本身的运行逻辑仍然存在,并没有进行特别的保护,如果能够了解其本身的编译与运行机制,仍然能够逆向还原出可读性的代码。