JVM如何能够通过JIT从Java应用程序运行生成的机器代码?

JVM如何能够通过JIT从Java应用程序运行生成的机器代码?,java,jvm,Java,Jvm,JVM如何能够动态地将字节码编译成本机代码,然后执行它?我可以想象,将数据值写入内存是可能的,但如果我没有记错的话,程序就无法写入包含指令的内存(否则病毒可能会利用此功能并迅速扩散)。很少有体系结构实现内存保护级别(只有操作系统可以对包含代码的内存区域进行写访问)您所说的,Java使用JIT的那些区域肯定没有 病毒确实利用了这一功能,甚至可以更快地扩散。但是当你想到这一点时,在修改自己的代码的过程中没有什么本质上的危险。它并不比能够写入文件然后加载库更危险。通常,你不能直接写入内存中包含代码的部

JVM如何能够动态地将字节码编译成本机代码,然后执行它?我可以想象,将数据值写入内存是可能的,但如果我没有记错的话,程序就无法写入包含指令的内存(否则病毒可能会利用此功能并迅速扩散)。

很少有体系结构实现内存保护级别(只有操作系统可以对包含代码的内存区域进行写访问)您所说的,Java使用JIT的那些区域肯定没有


病毒确实利用了这一功能,甚至可以更快地扩散。但是当你想到这一点时,在修改自己的代码的过程中没有什么本质上的危险。它并不比能够写入文件然后加载库更危险。

通常,你不能直接写入内存中包含代码的部分,但是有一些方法可以覆盖它。对于JIT,通常要做的是在堆上有一些读写数据空间,然后使用诸如
mprotect
之类的操作使其可执行。

操作系统确实提供了分配“可执行”内存的工具。JVM需要以与标准malloc()不同的方式分配目标内存生成JIT代码时


例如,在Windows上,与一起使用。Linux、AIX等中存在类似的函数。

您是在问如何从Java运行机器代码还是JVM如何运行?病毒确实利用这一功能快速繁殖。您所说的“程序无法写入包含指令的内存”到底是什么意思?如果一个内存块已经被使用,那么程序将移动到一个空的空间。当然可以写入包含机器指令的内存,只是默认情况下该功能被禁用,以防止错误输入。您只需调用
mprotect
(至少在Linux上)Jeremiah Willcock:我指的是JVM如何将字节码编译成本地指令,然后执行它们。y days:-)@Pete Wilson我的意思是,进程可以将代码写入文件,然后要求操作系统将其作为动态库加载。从安全角度看,其效果与自修改代码相同。感谢Pete Wilson在关于病毒的声明中提出的有效观点。在不使用JIT的进程中,大多数页面都具有写入或执行预授权,但不是同时具有写入或执行预授权。在任何给定时刻,使用write+exec将页面数降至零对安全性来说都是一件好事:如果缓冲区溢出让攻击者将任意数据放入内存,而无法将其作为代码执行(如果攻击者还可以控制程序计数器,例如通过覆盖堆栈上的返回地址)可能会阻止他们做更多的事情,而不仅仅是破坏你的程序。但找到已经存在的可用代码块是一件事,请参阅返回到libc攻击。