.Net保護中的nativecompile方式

瑞克-rick發表於2007-08-25

據宣傳,這個功能就是將dotNet程式編譯成native的原生程式碼,有代表性的相關工具有xenocode, themida 和 remotesoft。
他們實際上屬於兩類:
一、偽編譯
就是把磁碟上的 dotNet程式轉換成 win32 的程式,但執行後在記憶體中實際上還是dotNet程式,只是使用了一個win32 loader,把dotNet程式整體打包嵌入到了這個 win32 的loader中。

二、ngen編譯
ngen 是 dotNet提供的將IL編譯成native的工具。
這種可以算是真實的編譯吧。

但是它們有一個共同的特點,依然不能脫離dotNet框架單獨執行,當然可以使用虛擬框架執行。

xenocode, themida屬於第一類,他們只是打包後生成的磁碟檔案是 win32的,這個其實只是一個loader,他們在執行時會是否出dotNet程式集(記憶體中),然後呼叫框架執行原始dotNet程式。在加密保護方法可以看著是整體加密保護類的加密殼。
算不上 native compile保護,但是 xenocode的宣傳說的是native保護,x還有一個功能就是可以直接把虛擬框架也一起打包進去,這樣執行起來確實很像是傳統的win32程式。

remote的就是利用 ngen 編譯成 原生程式碼。但是ngen編譯的原生程式碼也不能脫離framework單獨執行。而且ngen編譯的原生程式碼平臺依賴性很強,不僅不能脫離framework執行,而且一般都只能在其編譯時使用的framework中執行。
這樣釋出 ngen編譯的本地程式時必須同時打包編譯時使用的framework。

前面我介紹了一個利用飛信框架脫離framework執行 dotNet程式的方法。
其中飛信框架有兩個主要檔案 FetionVM.exe 和 FetionVM.srm 這個兩個是框架的loader程式,用來載入待執行的dotNet程式。

FetionVM.exe是native的win32程式,它實際上只是呼叫了rsdeploy.dll 裡面的三個函式來啟動 fetionvm.srm。srm這個檔案其實是一個最簡單的。net程式,在這個srm檔案裡面它會用反射啟動 引數傳遞進來的那個 。net程式。

FetionVM.exe很簡單,反彙編看看就清楚了。

fetionvm.srm是DotNet程式,如果你用reflector等工具檢視會發現它只是一個“空殼”,裡面啥都沒有。
真正的實體在
CWINDOWSassemblyNativeImages_v2.0.50727_32FetionVM6e39d95b1cb7d342a0ad2b892350dc65FetionVM.ni.exe 中。
FetionVM.ni.exe 就是 ngen生成的native檔案。
fetionvm.srm實際上使用了 native compile方式的保護。

fetionvm.srm這個檔案的存在只是用來欺騙framework,框架在載入 fetionvm.srm 後,根據其程式集名稱在 nativeimages中查詢是否存在 native code,如果有就會載入 native code版本的。

對於微軟 ni 的這種檔案格式資料不是很多,目前還不太清楚全部的檔案格式。
不過確定了一點, ni 的檔案中會包含原始的 後設資料。
據推測 ni 檔案中應該也會包含原始的IL程式碼,目前還沒有確定它們的關係,
如果能確定,那ngen生成的ni檔案就可以直接還原成 dotNet程式了。


相關文章