JIT编译代码是如何注入内存并执行的?

问题描述:

“考虑一个典型的Windows x86或 AMD64架构,内存是 可执行部分划分是 不能被写入并且可以写入,但不能 执行(觉得DEP)数据段 。”JIT编译代码是如何注入内存并执行的?

“JIT编译内存的方法,确实 (一般)不存储任何东西 磁盘,而不是移动它周围,其中 下一指令指针可以达到 它,改变当前指令 指针(指向JIT )指向 到新生成的代码,然后 执行它。“

这两个段落虽然有点过分简化,但我基本理解JIT和Windows的内存模型。我也知道,当我尝试在内存中手动拷贝一些可执行代码并尝试执行它时,我通常无法执行它(除非使用DLL注入)。

JIT设计师如何克服这一障碍?他们是否使用ring-0驱动程序或者是否在用户模式下完成所有操作?

它只是使用Windows VirtualProtect()API函数完成的。它更改虚拟内存页面属性。从PAGE_READWRITE开始,JIT编译器可以将机器码写入PAGE_EXECUTE_READ,以便执行。由于该页面由运行JIT编译器的进程拥有,因此不需要特殊权限即可。

+0

真的,*那*简单?说得通。 (OT)啊,我记得,上次我需要注入一些它不在我自己的进程中的东西(例如,删除当前正在运行的可执行文件,首先卸载可执行文件,典型的鸡/蛋问题)。 – Abel 2010-07-28 18:39:50

+0

@Hans:进一步了解它,我想知道这与[Social MSDN post](http://social.msdn.microsoft.com/Forums/en-US/clr/thread/2a043d8c-3ac4-4b3d- 9837-0bfe8e7d6788),解释您需要管理员权限才能使用'VirtualProtect'来更改标志并声明它不能以这种方式工作。对于ActionScript,同样的原则适用于'VirtualAlloc',[这位博主显然表明](http://null.co.in/2010/04/29/spraying-just-in-time/)(他得到名称错误,请参阅他的第三张图片的下标)。这两篇文章让我认为它会是'VirtualAlloc'。你在这里有什么想法? – Abel 2010-07-29 07:29:41

+0

@Abel:看起来很熟悉。不,我在那篇文章中指出,不需要管理员权限。 OP同意了。 – 2010-07-29 09:41:52