在《如何使.Net 程序脫離.net framework框架》一文中介紹了讓.NET程序脫離.NET框架的方法,但是這樣仍需要一個(gè)動(dòng)態(tài)鏈接庫的支持,那么這個(gè)虛擬框架道理是如何實(shí)現(xiàn)的呢?本文介紹虛擬框架的核心實(shí)現(xiàn)原理。
雖然能讓.NET 程序脫離 .net framework框架運(yùn)行,但是仍然需要依賴 rsdeploy.dll 才行。本文就介紹這個(gè) dll 的實(shí)現(xiàn)原理。
簡單的實(shí)現(xiàn)方式:首先我們需要用到一個(gè) undocumented features ,在dll被加載時(shí),設(shè)置環(huán)境變量 COMPLUS_InstallRoot 為當(dāng)前dll所在目錄。另外復(fù)制 c:/windows/microsoft.net/framework/v1.14322 或者 v2.0.50727 到 dll所在目錄。把mscoree.dll 以及crt運(yùn)行庫放到 dll目錄中。在dll目錄中創(chuàng)建一個(gè)本地的 GAC 目錄,再把 需要的 GAC assemblies 復(fù)制進(jìn)去。
這樣子就 OK 了,簡單的 .Net程序就可以在這個(gè)環(huán)境中運(yùn)行了。如果是復(fù)雜的程序 還需要實(shí)現(xiàn)一個(gè)虛擬注冊表系統(tǒng)。對于我們虛擬框架這個(gè)應(yīng)用來說,只需要實(shí)現(xiàn)一個(gè)只讀的虛擬注冊表就OK了。
這個(gè)實(shí)現(xiàn)可以 ring0 也可以 ring3,考慮到兼容性 直接用ring3實(shí)現(xiàn)好了。
實(shí)現(xiàn)方式可以使用 api hook的方式,即在我們的dll加載時(shí) hook advapi32.dll 中所有Reg開頭的函數(shù)。虛擬注冊表系統(tǒng)的框架就完成了,剩下的就是實(shí)現(xiàn)了。
這個(gè)虛擬框架最核心的就是 設(shè)置環(huán)境變量 COMPLUS_InstallRoot 。
虛擬注冊表系統(tǒng)只是一個(gè)擴(kuò)展。我們還可以再擴(kuò)展一下,增加一個(gè)虛擬文件系統(tǒng)。這樣就可 以做成像 xenocode vas 那樣了。把整個(gè)程序部署成單一文件。
新聞熱點(diǎn)
疑難解答
圖片精選