天天看點

讓 .Net 程式 脫離 .net framework架構 運作(源代碼實作說明)

前面介紹了 “讓 .Net 程式 脫離 .net framework架構 運作的方法”,

該方法主要是利用了Fetion的架構來實作的,

今天我們要介紹的是不使用Fetion的架構,自己來實作Fetion架構的相關功能,

并給出相關實作代碼。

今回就給出 FetionVM.exe 功能實作的,近似代碼。

首先使用 remote的試用版 建立一個demo 程式,然後對這個demo程式進行分析,分析發現它的 loader 實際使用是通過調用 rsdeploy.dll 導出的三個函數完成初始化工作,并把控制權轉交到dotNet程式集。

這三個函數的原型定義:

typedef BOOL (WINAPI* pInitialize)(HMODULE h, LPCSTR szModule, LPCSTR szMainExe);

typedef BOOL (WINAPI* pReloc)(HMODULE hModule, PIMAGE_NT_HEADERS pNtHeader);

typedef BOOL (WINAPI* pResolveImportDLL)(HMODULE);

有朋友對此多有不滿,删除完整實作代碼,隻對實作代碼進行說明,感興趣的朋友可以參考自己實作一下。

首先是Load要運作的dotNet程式檔案,得到HMODULE 句柄,在三個函數中都要用到了。

然後調用 Initialize函數,szModule 是 dotNet程式的檔案名,szMainExe 目前執行檔案的檔案名。

再調用 Reloc 處理重定位表。pNtHeader 也是 dotNet程式在記憶體中加載後的 NtHeader。

然後 調用ResolveImport,處理導入的dll。

最後将jmp到 dotNet程式的入口,轉移控制權。

另外我還發現了另外一種使用實作方法,就是上次提到的那個 dotNet加密殼的 vm unpacker,它也使用了remotesoft 的虛拟架構,但是它沒有使用rsdeploy導出的那三個函數。

昨天上 ReTeam 的論壇看到這個 unpacker 更新了。下載下傳回來研究了一下,對于其初始化 DotNetVM 的部分還沒有細看,主要看了一下它對架構 hook 的變化,發現其在Jit層中的 Hook 位置移動了。好像是Hook了 emitter對象的一個成員函數,emitter對象是被 complie調用的,位置應該算比較深了,方法體重構方式沒有變化。目前的加密殼核心似乎都無法逃過其Hook的攔截。

它攔截的位置比較深,DNGuard HVM标準版對其也沒有檢測,不過對于DNGuard HVM标準加密的程式集,其脫殼功能仍然無害。試用版的就不能幸免了。

目前對其使用 dotnetvm 的方法比較感興趣了,簡單的看了一下,它隻是load了rsdeploy.dll。沒有調用rsdeploy導出的三個函數。看起來好像是直接調用了mscorwks中的函數,有可能它自己實作了這三個函數的功能。

感興趣的朋友可以一起來分析一下,有什麼收獲再跟大家分享。

繼續閱讀