在讓.Net 程序脫離.net framework框架運行(源代碼實現說明) 中我們介紹的脫離框架運行的方法,仍然需要依賴rsdeploy.dll才行。今回我們就介紹這個dll的實現原理。
簡單的實現方式:首先我們需要用到一個undocumented features,在dll被加載時,設置環境變量 COMPLUS_InstallRoot 為當前dll所在目錄。
另外復制c:\windows\microsoft.net\framework\v1.14322或者v2.0.50727到dll所在目錄。把mscoree.dll 以及crt運行庫放到dll目錄中。在dll目錄中創建一個本地的GAC目錄,再把需要的GAC assemblies復制進去。
這樣子就OK了,簡單的.Net程序就可以在這個環境中運行了。如果是復雜的程序還需要實現一個虛擬注冊表系統。對於我們虛擬框架這個應用來說,只需要實現一個只讀的虛擬注冊表就OK了。
這個實現可以ring0 也可以ring3,考慮到兼容性直接用ring3實現好了。
實現方式可以使用api hook的方式,即在我們的dll加載時hook advapi32.dll 中所有Reg開頭的函數。虛擬注冊表系統的框架就完成了,剩下的就是實現了。