概述:C#編寫的代碼若是不進行必定程度的混淆和加密,那麼是很是容易被反編譯進行破解的,特別是對於一些商業用途的C#軟件來講,由於盯着的人多,更是極易被攻破。使用Dotfuscator有助於防止程序被逆向工程,同時使程序更小和更高效。html
C#編寫的代碼若是不進行必定程度的混淆和加密,那麼是很是容易被反編譯進行破解的,特別是對於一些商業用途的C#軟件來講,由於盯着的人多,更是極易被攻破。現今不少用C#編寫的項目,作出的產品,都會遇到這種狀況:C#的代碼辛辛苦苦寫出來以後,一個反射工具,就能夠徹底顯露出來,這樣會是個什麼結果,不說被反射出來照搬功能,就是註冊和加密的那一部分都會被輕易拿到,因此就必須使用代碼混淆器。小程序
C#的代碼混淆器有不少了,好比Dotfuscator、xeoncode、foxit等等。這些混淆器大可能是須要注意的,使用效果各不相同。普通的代碼混淆器只是把私有字段和變量轉換成隨機碼,若是是小程序,還能夠猜一猜,若是是比較大的程序,猜起來可就不會那容易了。高級一點的是混淆成不可閱讀的字符,這樣的混淆後的代碼乾脆就比機器碼還難懂,基本上是翻譯不出來了。但這些代碼混淆器都有必定的風險,即混淆後的代碼實然沒法正常調用了。函數
這裏介紹的是DotfuscatorPro_4.9.7750版本,安裝 Dotfuscator 好 打開界面,有幾個須要配置的地方: Options、Input、Rename、String Encryption、Build,其餘的默認便可,下面一一講解。 工具
這是全局配置選項,把 Disable String Encryption 設爲 NO,即啓用字符串加密;檢查 Disable Control flow、Dsiable Renaming 也爲 NO,即保證控制流和混淆功能打開,其餘默認。以下圖:ui
選擇你須要混淆加密的 dll、exe文件,其中Library不要勾選,不然有些類、變量等等不會混淆。加密
勾選「use enhanced overload induction」(使用加強模式),注意:不要勾選下方的「 Do not suppress on serializable types」,即序列化類型的變量不加密,不然編譯後可能異常; 「Renaming Scheme」 選擇「Unprintable」(不可打印字符,即亂碼),也能夠選擇其餘如小寫字母、大寫字符、數字的方式。spa
include裏勾選須要字符串加密的工程文件exe、dll等。翻譯
設置輸出目標文件夾,點擊上方的運行按鈕便可從新生成新的 exe、dll文件了。code
接下來來看一下一段簡單的C#代碼加密混淆後的效果:htm
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static readonly int A = B * 10; static readonly int B = 10; //const int A = B * 10; //const int B = 10; public static void Main(string[] args) { Person p = new Person(); Console.WriteLine("A is {0},B is {1} ", A, B); } } public class Person { static int age; } }
使用Dotfuscator進行代碼混淆後 咱們使用著名的反編譯軟件 Reflector 來查看,能夠發現函數體內的代碼已經看不到了,字符串也變成了亂碼,函數名稱也不可見了,效果圖以下:
Dotfuscator做爲一款代碼混淆的軟件,具備很強的反編譯功能,但使用時應注意如下幾點:
固然若是你編寫的軟件不涉及商業用途的話,本着開源的思想,不推薦使用代碼混淆器。使用代碼混淆器存在必定的風險,在使用前最好作好相關代碼備份。
補充: https://www.cnblogs.com/ghost79/articles/1565280.html
C#的代碼辛苦寫出來以後,一個反射工具,就能夠徹底顯露出來。
固然,在作項目時,這個功能還不錯。由於我就曾在一個項目上使用C#,沒有進行任何混淆。結果在項目二年多以後,須要作一些調整,本身保存的源代碼丟失了。當時也嚇了一跳,但是想到反射工具,趕快拿出來用一下。雖然在反射出來會出現一些錯誤,但畢竟大部分代碼也都弄出來了。
這是在項目上,還有好處的,但是,試想一個產品,被別人給反射了,會是怎麼樣的一個狀況,不說他去照搬功能,就是註冊、加密那部分都會被輕易拿到。這可不是什麼一個好主意。
因而,必需要使用代碼混淆器。
C#的代碼混淆器有不少了,好比Dotfuscator、xeoncode、foxit等等。
這些混淆器大可能是須要注意的,使用效果各不相同。普通的代碼混淆器只是把私有字段和變量轉換成隨機碼,若是是小程序,還能夠猜一猜,若是是比較大的程序,猜起來可就不會那容易了。高級一點的是混淆成不可閱讀的字符,這樣的混淆後的代碼乾脆就比機器碼還難懂,基本上是翻譯不出來了。
但這些代碼混淆器都有必定的風險,即混淆後的代碼實然沒法正常調用了。
而我一直用.NET Reactor,這個很是小巧,免安裝,並且不須要註冊。他只是將代碼換成隨機碼,可是混淆後的代碼都能正常使用。
可是有一點須要注意:凡是須要序列化成二進制的代碼,是不能用混淆器的。混淆後的代碼將不能正常序列化!
共享一下這個混淆器: