JVM如何可能动态地将字节码编译成本机代码然后执行它?我可以想象有可能将数据值写入内存,但如果我没记错,程序就无法写入包含指令的内存(否则病毒可能会使用此功能并迅速扩散)。
答案 0 :(得分:4)
很少有架构实现内存保护级别(只有操作系统对包含代码的内存区域具有写访问权限),而Java使用JIT的内存绝对不会。
病毒确实使用此功能,甚至可以更快地扩散。但是当你考虑它时,在修改自己的代码的过程中没有任何本质上的危险。它没有比写入文件然后加载库更危险。
答案 1 :(得分:4)
通常,您无法直接写入包含代码的内存部分,但有一些方法可以覆盖它。对于JIT,通常所做的是在堆上有一些读写数据空间,然后使用mprotect
等操作使其可执行。
答案 2 :(得分:3)
操作系统确实提供了分配“可执行”内存的工具。在生成JITed代码时,JVM需要以与标准malloc()不同的方式分配目标内存。
例如,在Windows上,将VirtualAlloc与PAGE_EXECUTE一起使用。 Linux,AIX等中存在类似的功能......