代码之家  ›  专栏  ›  技术社区  ›  Abel

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

  •  9
  • Abel  · 技术社区  · 15 年前

    “考虑典型的Windows x86或 AMD64架构,内存 分为可执行部分 无法写入和数据节 执行(如DEP)

    JIT在内存中编译方法,是吗 (通常)不储存任何东西 磁盘,而是将其移动到 它改变了当前的指令 新生成的代码,然后 执行它。”

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

    1 回复  |  直到 5 年前
        1
  •  11
  •   Hans Passant    15 年前

    只需使用Windows VirtualProtect()API函数即可完成。它会更改虚拟内存页属性。从PAGE\u READWRITE,JIT编译器可以将机器代码写入PAGE\u EXECUTE\u READ,以便执行。这样做不需要任何特权,因为该页由同时运行JIT编译器的进程拥有。