就我所知,現在就此打電話還爲時過早。我個人不知道如何在不使用VirtualProtect()的情況下編寫抖動,這是一個核心的winapi函數,它允許您將由抖動生成的機器代碼的內存塊轉換爲可執行代碼。
WinRT應用程序提供了許多原生winapi函數。有福的系統功能列表是available here。與內存相關的apis非常有限,VirtualQuery是列表中唯一接近的內容。
那麼現在的語言預測怎麼做呢?我們來看一下。 CLR有一個投影,它會被加載到您用C#等託管語言編寫的任何Metro應用程序中。在c:\ windows \ microsoft.net \ framework \ v4.0.30319 \ clr.dll上運行dumpbin.exe/imports會生成一個相當大的Windows DLL依賴關係列表。從轉儲片段:
Dump of file clr.dll
File Type: DLL
Section contains the following imports:
KERNEL32.dll
...
430 RaiseException
581 VirtualAlloc
584 VirtualFree
589 VirtualQuery
587 VirtualProtect <=== here!
339 HeapDestroy
336 HeapAlloc
342 HeapValidate
540 SleepEx
547 SwitchToThread
... etc
另一種語言投影是Javascript,在「查克拉」引擎來實現。很難找出DLL實現該引擎的具體內容,它只是一個代碼名稱。運行啓用了非託管調試的示例Javascript項目會顯示「jscript9.dll」已加載。讓我們做這個dumpbin.exe /進口:
....
6898F4D5 10D DebugBreak
6891FDA1 55E TerminateProcess
6898EF9E 57E UnhandledExceptionFilter
6891FD58 43C RaiseException
68903BB7 59E VirtualProtect <=== here!
6A218590 366 InterlockedPushEntrySList
6A2185A9 365 InterlockedPopEntrySList
6A2195AA 35C InitializeSListHead
689026F9 598 VirtualAlloc
68902852 59B VirtualFree
6890603E 4A2 ResetWriteWatch
...etc
嗯,它在那裏。它必須是。問題是,現在你不能調用這個函數。它肯定不會通過商店驗證器的審查。
這需要燉,至少直到real WinRT變得可用,運行在ARM內核上。不僅僅是在Win32上運行的那個,你現在已經在Windows 8 Consumer Preview中運行了。並且可以輕鬆利用現有的winapi功能,而不僅僅是修剪列表。這可能會在今年年底左右。直到明年夏天,真正的硬件纔會掌握在你的手中。
WinRT在這裏幾乎充當沙箱,因此API訪問VirtualAlloc/VirtualProtect不會改變,因爲API幾乎已經準備好進行OEM了。基本上,除了.NET CLR/JIT(以及所有可以被拼寫的動態.NET語言)外,沒有辦法實現JIT。 – xoofx 2012-04-25 14:09:06
當我談到WinRT時,我正在談論整個「WinRT生態系統」,意思是純粹的「WinRT」+ Win32/COM授權API。用於Windows 8 Metro App的受限Win32/COM API幾乎作爲一個沙箱。所以沒有辦法讓PE部分讀取+寫入+可執行文件,所以沒有JIT。這是迄今爲止在Windows 8 Metro中設計的,我非常懷疑這個設計將在發佈預覽前1個月發生變化。 – xoofx 2012-04-25 14:27:42
'HeapCreate'與'HEAP_CREATE_ENABLE_EXECUTE'? – 2015-11-04 22:04:19