讓基於.NET的程序變成綠色版獨立運行

臨近國慶了,要搶火車票了,但是發現"12306分流"搶票軟件是基於.NET4.0開發的,要求安裝.NET4.0.
Windows XP集成了.NET2.0版本
Windows 7集成了.NET3.5版本
Windows 8集成了.NET4.0版本
由於目前使用的是Windows 7,沒有.NET4.0環境.當然安裝是沒問題的.
但是作爲一個系統技術愛好者,總是想研究一下與衆不同的方案??? 有沒有可能免安裝.NET4.0環境?


百度找到一些陳舊的資料, 說明跟我有一樣需求的人還是存在的.

方案一:使用MONO
MONO是爲了讓.NET程序跨平臺的產物,支持Windows系統
軟件下載地址: https://www.mono-project.com/download/stable
經過一番研究,並沒有成功運行我的程序.
估計是需要用它的SDK重新編譯程序,才能跨平臺運行吧.

 

方案二:使用飛信.NET虛擬機
老版本的飛信軟件,基於.NET開發,使用了定製版RemoteSoft DotNET Linker工具.
下載後發現它可以運行大部分.NET2.0版本的程序.
運行方法是FetionVM.exe your.exe
但是不能運行.NET4.0的程序.
由於它的核心方案是利用RemoteSoft DotNET Linker,所以我去找原版工具研究下.

方案三:RemoteSoft DotNET Linker
這個軟件是商業性質軟件,不過我覺得吧,除了像我這種crazy愛好者,應該沒有什麼企業會考慮這個方案吧.
目前早已經停止更新了,官網也下線了,網上能找到的最新版本是2.1.0破解版.
這個工具包目的就是把你的.NET程序打包爲綠色版,它會自動收集所需的文件,並生成一個文件夾.

所以今天的重點就是研究RemoteSoft DotNET Linker能不能實現運行基於.NET4.0的程序.

文件夾結構如下圖:


經過研究,飛信裏面的FetionVM.exe其實就是mini.exe.
飛信裏面的rsdeploy.dll版本號是1.0.6
這裏下載的rsdeploy.dll版本號是2.1.0,這個版本可能要新一些?
嘗試打包一個小工具後,發現要打包的目標程序會被命名爲mini.rsm文件.由mini.exe進行啓動.
還會生成一個文件夾結構,與飛信非常類似.

飛信的FetionVM.exe也是加載FetionVM.rsm,這個FetionVM.rsm就是一個空的.NET引導程序.
它會運行命令行參數指定的程序.經過實驗驗證這種方案兼容性要差一些.
兼容性最好的辦法是直接把要運行的程序改爲爲mini.rsm,由mini.exe直接運行.成功率高很多.

由於它們提供的.NET版本都是2.0.50727,爲了研究它能不能支持.NET4.0的程序.
對工具包的文件結構進行了分析,經過分析這套工具的原理大概是類似於IO重定向,
運行.NET程序時需要訪問的註冊表和文件都重定向到本地目錄.
mdeploy.registry這個文件就是重定向的虛擬註冊表.
另外還有一個叫c的文件夾,裏面裝的是windows\assemly.這就是重定向的虛擬系統盤路徑.
基於這個原理,我猜測理論上應該是可以支持任意版本的.NET程序的!
畢竟Windows系統的核心內容不就是註冊表和文件組成的嗎?..............................

爲了證明這個猜測,我從裝好.NET4.0的虛擬機裏面提取出.NET4.0相關的所有文件,以及註冊表.
把註冊表中HKLM\SOFTWARE的內容導出到mdeploy.registry
把虛擬機C:\Windows\Microsoft.NET\Framework下面的v4.0.30319全部複製到本地文件夾.
把虛擬機C:\Windows\assemly下面的文件全部複製到本地文件夾.
把bypass.exe改名爲mini.rsm運行mini.exe測試一下.
報錯!.......
報錯!.......
報錯!.......


這個時候輪到procmon上場了,跟蹤一下是缺少哪個文件?
唔,發現一個問題,它要加載c\windows\assembly\GAC_MSIL\System\4.0.0.0__b77a5c561934e089
而實際上在安裝好.NET4的Windows7系統中並沒有這個文件.
搜索了一下,發現微軟真是奇葩,竟然把.NET4的GAC文件移到了C:\Windows\Microsoft.NET\assembly文件夾.
而C:\Windows\assembly下面只有.NET2.0的GAC文件!!!
把這些缺失的文件拷貝到本地目錄,再次測試.....
還是報錯!.......
還是報錯!.......
還是報錯!.......

唔,發現一個問題,mini.exe運行時加載的程序集名稱是:4.0.0.0__b77a5c561934e089
但是微軟的命名又改了,變成了:v4.0_4.0.0.0__b77a5c561934e089
多了一個v4.0_的前綴,真是日了MS了!!!!
原本.NET2.0版本的命名都是規範的2.0.0.0__b77a5c561934e089
爲什麼到了.NET4.0要把名改爲了v4.0_4.0.0.0__b77a5c561934e089???
加個v4.0的前綴是幾個意思???難道4.0.0.0還不能表示版本號嗎???
這次把所有帶v4.0前綴的文件夾,全都改名.再次測試.....
還是報錯!.......
還是報錯!.......
還是報錯!.......

唔,發現一個問題,缺少msvcr100_clr400.dll
少文件都好說,添加進來就是了..再次測試...

啊! 真的運行起來了!雖然啓動慢了點,但是成功了!
分流會提示我軟件名不能修改,要改爲bypass.exe才行.
改名後,又發現版本要更新....
更新後,又發現文件被它替換了.
真正的bypass.exe被我改名爲bypass.rsm了.
而現在的bypass.exe是我的加載器,結果被它自動更新程序替換成了真正的bypass.exe.
又得重新改名字..................

每次運行程序都要把目標程序改名爲mini.rsm文件.雖然麻煩了點.
但是RemoteSoft DotNET Linker真是個好東西!
開發出這樣的軟件是個有想法的人!
這套工具的兼容性還不錯,我試了好幾個程序,都能正常運行.

 

目前添加的文件和註冊表內容有點多, 還有待精簡,..................

還有就是要修改一下mini.exe的程序邏輯,讓它可以加載任意程序文件就好了................

最後把工具包的最小系統(不含任何.NET文件)上傳上來,做個存檔以後備用:
下載地址:https://download.csdn.net/download/qq446252221/11672183

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章