“考虑典型的Windows x86或 AMD64架构,内存是 分为可执行部分 无法写入和数据部分 可以写但不能写 执行(想想DEP)。“
“JIT编译内存中的方法,确实如此 (通常)不存储任何东西 磁盘,而不是移动到哪里 下一个指令指针可以到达 它,改变当前的指令 指针(指向JIT)指向 到新生成的代码然后 执行它。“
这两段,虽然有点过于简单,但我基本上了解JIT和Windows的内存模型。我也知道当我尝试手动复制内存中的一些可执行代码并尝试执行它时,我通常无法做到(除非使用DLL注入)。
JIT设计师是如何克服这个障碍的?他们使用ring-0驱动程序还是在用户模式下完成所有操作?
答案 0 :(得分:10)
只需使用Windows VirtualProtect()API函数即可完成。它会更改虚拟内存页面属性。从PAGE_READWRITE开始,JIT编译器可以将机器代码写入PAGE_EXECUTE_READ,以便执行它。由于该页面由同时运行JIT编译器的进程拥有,因此不需要特殊权限。