2010-07-28 78 views
9

「考慮一個典型的Windows x86或 AMD64架構,內存是 可執行部分劃分是 不能被寫入並且可以寫入,但不能 執行(覺得DEP)數據段 。」JIT編譯代碼是如何注入內存並執行的?

「JIT編譯內存的方法,確實 (一般)不存儲任何東西 磁盤,而不是移動它周圍,其中 下一指令指針可以達到 它,改變當前指令 指針(指向JIT )指向 到新生成的代碼,然後 執行它。「

這兩個段落雖然有點過分簡化,但我基本理解JIT和Windows的內存模型。我也知道,當我嘗試在內存中手動拷貝一些可執行代碼並嘗試執行它時,我通常無法執行它(除非使用DLL注入)。

JIT設計師如何克服這一障礙?他們是否使用ring-0驅動程序或者是否在用戶模式下完成所有操作?

回答

9

它只是使用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