就我所知,现在就此打电话还为时过早。我个人不知道如何在不使用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