1. 程式人生 > >防止.NET程式集被破解辦法

防止.NET程式集被破解辦法

.net是一種建立在虛擬機器上執行的語言,它直接生成 MSIL 的中間語言,再由.net編譯器 JIT 解釋映象為本機程式碼並交付CPU執行。中間語言很容易被反編譯,所以研究下如何有效的保護dll檔案。
我大致的方法為 :強簽名+混淆+加密
強簽名
強命名程式集,可以確保你的程式集唯一,而不被篡改、冒用等;即使相同名字的程式集如果簽名也會不同。
如果(添加了強名稱的)專案中引用了其他沒有原始碼的dll檔案,並且此dll檔案是沒有強名稱的程式集,則編譯時會出現類似 "Assembly generation failed -- 引用的程式集 'xxxxxxxxxxx' 沒有強名稱" 這樣的錯誤。
我這裡引用的是Interop.Scripting.dll程式集,它不是強名稱的,則需要進行以下操作:
1.開啟SDK 命令提示視窗;
2.建立一個新的隨機金鑰對:
sn -k Interop.Scripting.snk
3.反編譯目標程式集
ildasm Interop.Scripting.dll /out=Interop.Scripting.il
4.重新編譯,附帶強命名引數
ilasm Interop.Scripting.il /dll /resource=Interop.Scripting.res /key=Interop.Scripting.snk /optimize
5.驗證簽名信息
sn -v Interop.Scripting.dll
OK,將生成的dll檔案重新引入到專案中然後編譯。
注:未簽名的主程式可以引用已簽名或未簽名的程式集;而已簽名的主程式不能引用未簽名的程式集。(上述文章有相應解決辦法)
混淆

混淆就是對編譯生成的MSIL中間程式碼進行模糊處理,最簡單的混淆是名稱混淆,即將 名稱空間名、類名、方法名、欄位名等統統換成特殊符號或其它符號,目的就是讓人看到暈為止,但是並不改變程式執行邏輯。
我這裡使用的Dotfuscator進行混淆。
Dotfuscator混淆方法:
1.建立新工程;
2.選擇要混淆的dll、exe檔案;
3.在屬性裡選擇Library屬性(很重要,因為我這裡要混淆的是dll檔案,如果不選中,混淆後將不能被正確呼叫!),如下圖所示:
4.選擇bulid標籤,點選bulid按鈕進行混淆。
我們也可以選擇其它標籤進行加密字串、增加水印等操作,我這裡加密工作用另外的方法,所以沒有選擇操作。
OK,混淆完成後,我們可以用Reflector.exe來反編譯下混淆後的dll檔案,可以對比原始碼看下效果。
加密

接下來我們繼續對混淆過的dll檔案進行加密處理,進一步保護dll檔案。
我使用的加密工具是MaxtoCode。
開啟軟體後,切換到中文,可以看到非常簡單,新增上dll檔案後,直接點選執行加密就可以。其他選項比如:加密字串、強名稱等都很簡單,大家一試就知道,而且MaxtoCode的幫助做的非常友好,一看就會使用。
加密後的dll檔案比先前大了一倍,用Reflector.exe反編譯後,發現dll檔案加密的更徹底,因為主體函式內容都隱藏了。
通過以上三步,使您的dll檔案可免於一般人的破解,當然,不可能絕對防止被破解。