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

Abe*_*bel 9 .net clr jit

"考虑一个典型的Windows x86或AMD64架构,内存分为无法写入的可执行部分和可写入但无法执行的数据部分(想想DEP)."

"JIT编译内存中的方法,(通常)不会将任何内容存储到磁盘,而是将其移动到下一个指令指针可以到达的位置,更改当前指令指针(指向JIT)以指向新生成的代码,然后执行它."

这两段虽然有点过于简单,但我基本上理解JIT和Windows的内存模型.我也知道当我尝试手动复制内存中的一些可执行代码并尝试执行它时,我通常无法做到(除非使用DLL注入).

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

Han*_*ant 10

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

  • @Hans:在编译完成后,您是否碰巧知道CLR JIT是否确实删除了对包含生成代码的页面的写访问权限?或者他们是否有"PAGE_EXECUTE_READWRITE"访问权限? (2认同)