18

假設我想創建一種新的編程語言或使用MS(Haskell,Java ...不管)支持的語言,但希望能夠針對Windows 8 metro/winRT進行編碼。在Windows 8 metro/winRT中是新的JIT編程語言嗎?

我知道Metro UI中的所有應用都是沙盒。
我知道我可以用本機C++編程,所以我認爲我也可以在C或彙編中執行它。
但是:

  1. 是否有可能創建將產生在飛行中彙編代碼JIT - 像CLR JIT-不打破沙箱的限制?
  2. 假設我將只使用API allowed in Metro sandbox是否有可能不使用XAML作爲UI界面? - 我可以直接使用Direct2D/DirectX嗎?

回答

13

就我所知,現在就此打電話還爲時過早。我個人不知道如何在不使用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功能,而不僅僅是修剪列表。這可能會在今年年底左右。直到明年夏天,真正的硬件纔會掌握在你的手中。

+1

WinRT在這裏幾乎充當沙箱,因此API訪問VirtualAlloc/VirtualProtect不會改變,因爲API幾乎已經準備好進行OEM了。基本上,除了.NET CLR/JIT(以及所有可以被拼寫的動態.NET語言)外,沒有辦法實現JIT。 – xoofx 2012-04-25 14:09:06

+1

當我談到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

+0

'HeapCreate'與'HEAP_CREATE_ENABLE_EXECUTE'? – 2015-11-04 22:04:19

7

是的,可以在WinRT上爲其他編程語言編寫投影。它甚至被鼓勵。本月早些時候召開的一次名爲Lang.Next的會議在微軟校園舉行,全部都是關於語言設計的。其中一個會議專門針對這個話題,你可能想看(我有):http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime並閱讀頁面上的評論。讓我引用一個:

馬丁明確表示,我們不僅要語言的設計者和實施者 到的WinRT添加到他們的目標平臺列表他們 語言和工具鏈,但我們會提供幫助和建議。

所以開始吧! :-)

5

1)除了可以訪問某些受限制的API的瀏覽器(並且可以集成它們的JIT,但afaik,尚未發佈用於瀏覽器的授權API),標準Win8 Metro應用程序將無法訪問例如「VirtualAlloc/VirtualProtect」(用於創建/更改讀/寫/可執行內存頁面)的功能:這意味着在Windows 8 Metro App下使用C++開發的JIT將無法通過認證。您可以使用Visual Studio 11 Beta提供的認證工具包檢查您的應用程序。

有人可能會說「我要破解PE部分強制讀取+寫入+可執行文件」部分,而不必使用VirtualAlloc/VirtualProtect功能,但不幸的是,這種破解也無法使用,因爲您被迫用選項/ NXCOMPAT:YES編譯Windows 8 Metro exe文件,這意味着它啓用了「數據執行保護」(DEP)。

另一個可能會試圖生成DLL並使用新的「LoadPackagedLibrary」從磁盤加載它們,但是如果DLL不是原始部署的一部分,則該函數實際上被鎖定(實際上,我沒有能夠使其正常工作)

唯一可用的JIT是.NET JIT。所有.NET動態語言(如IronPython/IronRuby)(如果它們已更新爲Win8 Metro)正在使用DLR(.NET中的動態語言運行時)或甚至反射發射,將會被激發。所以,如果你的目標是.NET CLR字節碼,你可以讓你的代碼搞定。

例如,能夠在.NET中運行Java代碼的IKVM.Net CLR可以在Windows 8 Metro應用程序下運行(但只能使用經過認證的Win8 Metro API進行重構)。

2)是的,可以在不使用XAML的情況下編寫Direct2D/Direct3D11應用程序。

檢查Windows 8地鐵樣本http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples。例如,大多數Direct2D樣本不使用XAML。

作爲Metro Window系統的低級API的CoreWindow類是純Direct2D/Direct3D11應用程序的入口點。

+0

DEP是否確實阻止了顯式標記爲可執行的內存中的代碼執行?正常的代碼部分仍然可執行AFAIK – 2012-07-28 00:16:29

0

值得注意的是,即使您設法讓JIT工作,也許可能通過發佈CLR字節碼而不是本地機器代碼,或者即使您只是在沒有JIT的情況下實現瞭解釋器,也只能運行代碼包含在您的原始應用程序包中。如果您從應用程序外部下載了腳本/字節碼/等等,並嘗試運行/ JIT /在「本地上下文」中解釋它(即直接訪問WinRT庫),您可能會(除了可能的例外 - 請參閱下面的註釋)違反的應用程序認證要求部分3.9:

3.9所有應用邏輯必須從起源,並駐留在您的應用程序包 您的應用程序不能試圖改變或以任何形式延長包裝內容動態包含代碼或數據,這些代碼或數據會更改應用程序與Windows運行時之間的交互方式,或者針對Store策略行爲。例如,下載遠程腳本並隨後在應用程序包的本地上下文中執行該腳本是不允許的。

這裏棘手的措辭是在這個「本地背景」句子。目前尚不清楚這意味着什麼。例如,如果您的網頁瀏覽器控件具有對網站開放的門戶(或者在「web上下文」中運行的HTML應用程序中的iframe),那麼該Web瀏覽器/ iframe會「運行」JITed JavaScript代碼,但它將運行在不同的「上下文」中,並且不能直接訪問WinRT API。目前尚不清楚這種異常是僅用於XAML中的IE瀏覽器控件還是用於html應用程序的iframe w/web上下文,或者是否可以在解釋器或動態運行時實現自己的「web上下文」。

也就是說,您可以預編譯任何類型的應用程序代碼,以將代碼獲取到應用程序中並進行認證,類似於在iOS上完成的操作,除了您可以選擇預先編寫代碼,編譯爲.NET,本地機器代碼或JavaScript。

6

Here's a trick I found to gain access to these missing APIs (VirtualAlloc, VirtualProtect), which are required in order to implement a jitter(聲明:這是我的博客)。

通過玩不安全的C#代碼,您可以繞過.NET反射的限制並調用內部P/Invoke方法Win32Native.GetProcAddress。一旦你有了這個功能,你就可以自動訪問任何Win32函數,包括VirtualAlloc

+0

感謝您發佈您的答案!請務必仔細閱讀[自助推廣常見問題](http://stackoverflow.com/faq#promotion)。另請注意,每次鏈接到您自己的網站/產品時,您都必須*發佈免責聲明。 – 2012-12-17 15:12:01

+0

@AndrewBarber謝謝你,修好了 – Andrea 2012-12-17 15:22:44