『壹』 如何在Visual Studio中利用命令行集成Dotfuscator混淆處理
首先在Visual Studio中打開Dotfuscator:點擊菜單欄中的 工具 > PreEmptive Protection - Dotfuscator 打開Dotfuscator。
此處默認新建了Dotfuscator項目,建議先進行保存,將文件保存至你要混淆項目的解決方案文件夾中,如,個人保存的位置為: E:/Projects/OpenSourceProject/ReferenceDoc/Dotfuscator/Samples/DotfuscatorSample/DotfuscatorSample.xml
保存到解決方案文件夾並非必須,此處如此處理可以為了後面進一步處理更加方便。
添加待混淆文件,如圖所示:
修改文件路徑,將文件路徑修改為如下圖所示:點擊 屬性 ,查看 項目屬性 - configdir (就是之前的保存位置),然後切換回 輸入 ,點擊輸入中第三個按鈕 編輯輸入 (那支筆),將路徑中與 configdir 匹配的部分替換為 ${configdir} (注意是大括弧)。
處理此步驟亦不是必須的,這樣處理的原因是為了讓我們的配置與本地無關(相對路徑),方便其他人合作使用。
至此,基本配置就可以了,點擊生成項目就可以進行混淆了。至於其他更多配置見官方文檔。
本地可以直接在Dotfuscator工具中點擊菜單欄中的 幫助 > 幫助目錄 (此為中文文檔,基礎的配置基本都有)。
幫助文件本地目錄參考(中文幫助): C:/Program Files (x86)/Microsoft Visual Studio 14.0/PreEmptive Solutions/Dotfuscator and Analytics Community Edition/zh-Hans
配置Visual Studio命令調用Dotfuscator 主要操作就是編輯生成後事件:右擊項目 屬性 ,切換到 生成事件 頁面,編輯 後期生成事件命令行 ,添加如下代碼:
此處為了保證只有在Release的模式下使用混淆,故添加了Release判斷。
if $(ConfigurationName)==Release "C:/Program Files (x86)/Microsoft Visual Studio 14.0/PreEmptive Solutions/Dotfuscator and Analytics Community Edition/dotfuscatorcli.exe" /q "$(SolutionDir)DotfuscatorSample.xml"
代碼解釋:dotfuscator命令行工具+參數+項目混淆配置文件;其中配置文件之前保存到解決方案文件夾下,故此出可以直接用解決方案文件目錄來索引。
代碼中唯一不足就是命令行工具使用了絕對路徑,vs中的宏參數沒有可以直接使用的,若讀者有啥好方法將此變為相對路徑,望通知。 —— 但關於系統中添加環境變數的法子就不要了,個人不喜。
如果你在此處下一步需要進一步的打包處理,而你又需要Debug模式下一樣可以打包測試。如,本人使用WiX打包,需要配置文件路徑,方便一點就是要配置為生成路徑,但是release模式下,需要將混淆的打包進去,而非直接生成的文件。此時,你不能改打包配置(改路徑的話,debug會用不了),所以,你需要在將混淆過的文件拷貝到原來的release生成目錄。所以我最後完整的生成事件就是如下代碼了:
注意:經測試,如果在Dotfuscator中將生成路徑設為文件來源路徑,可以生成還會自動覆蓋,但軟體會用不了,具體原因不明。
if $(ConfigurationName)==Release "C:/Program Files (x86)/Microsoft Visual Studio 14.0/PreEmptive Solutions/Dotfuscator and Analytics Community Edition/dotfuscatorcli.exe" /q "$(SolutionDir)DotfuscatorSample.xml" if $(ConfigurationName)==Release x /e /y "$(SolutionDir)Dotfuscated/*.*" "$(TargetDir)"
代碼中的目錄可以見Dotfuscator配置的生成目錄:
『貳』 如何反編譯C#等net軟體類庫源代碼
這個需要看對方有沒有混淆,如果混淆了基本上反編譯出來都不便於閱讀。
1)如果沒有混淆且沒有加殼用Reflector.exe來反編譯;
2)如果沒有混淆但加了殼則用de4dot.exe來脫殼,脫殼後再用ILPsy.exe或Reflector.exe反編譯;
3)如果對方使用付費版且是最新版的Dotfuscator 來混淆,就算你反編譯後基本上閱讀不了。
『叄』 vs2010 中的 Dotfuscator 能不能做成編譯出來的東西自動混淆
代碼混淆基本沒什麼用,可以被反編譯的。
最好的做法是結合非託管堆代碼實現如下兩個目的
一、不能看:.NET DLL可以包含託管堆代碼(可以被反編譯的)與非託管堆代碼(不能被反編譯,要反編譯也是更高層次的了,不在討范圍內),我們將核心邏輯代碼置於非托堆代碼中,由託管堆代碼提供介面供外部調用,調用時將非託管代碼通過.NET動態編譯特性編譯後返回執行結果。這樣就保證了不能看。
二、不能調:我們在非託管代碼中加入驗證調用者來源功能,判斷調用者的HASH值是不是與在非託管代碼中約定的HASH值(發布時需要提前生成相關引用者的HASH值存於非託管代碼,最後生成非託管代碼的DLL放於安裝包中)一致,如一致則通過執行返回結果,不一致則返回空。這樣就解決了非合法來源不能調的問題。
更多參考:http://www.cnblogs.com/dengxi/p/5750170.html
『肆』 為什麼用c#開發的程序可以被反編譯
託管類庫屬於自描述類庫,編譯後,生成的中間語言(CIL),包含元數據,元數據就是對程序集的說明,通過元數據反編譯的,