Dotfuscator針對C#代碼混淆方法總結

概述:C#編寫的代碼若是不進行必定程度的混淆和加密,那麼是很是容易被反編譯進行破解的,特別是對於一些商業用途的C#軟件來講,由於盯着的人多,更是極易被攻破。使用Dotfuscator有助於防止程序被逆向工程,同時使程序更小和更高效。html

前言:

C#編寫的代碼若是不進行必定程度的混淆和加密,那麼是很是容易被反編譯進行破解的,特別是對於一些商業用途的C#軟件來講,由於盯着的人多,更是極易被攻破。現今不少用C#編寫的項目,作出的產品,都會遇到這種狀況:C#的代碼辛辛苦苦寫出來以後,一個反射工具,就能夠徹底顯露出來,這樣會是個什麼結果,不說被反射出來照搬功能,就是註冊和加密的那一部分都會被輕易拿到,因此就必須使用代碼混淆器。小程序

C#的代碼混淆器有不少了,好比Dotfuscator、xeoncode、foxit等等。這些混淆器大可能是須要注意的,使用效果各不相同。普通的代碼混淆器只是把私有字段和變量轉換成隨機碼,若是是小程序,還能夠猜一猜,若是是比較大的程序,猜起來可就不會那容易了。高級一點的是混淆成不可閱讀的字符,這樣的混淆後的代碼乾脆就比機器碼還難懂,基本上是翻譯不出來了。但這些代碼混淆器都有必定的風險,即混淆後的代碼實然沒法正常調用了。函數

這裏介紹的是DotfuscatorPro_4.9.7750版本,安裝 Dotfuscator 好 打開界面,有幾個須要配置的地方: Options、Input、Rename、String Encryption、Build,其餘的默認便可,下面一一講解。 工具

  • Settings->Global Options

    這是全局配置選項,把 Disable String Encryption 設爲 NO,即啓用字符串加密;檢查 Disable Control flow、Dsiable Renaming 也爲 NO,即保證控制流和混淆功能打開,其餘默認。以下圖:ui

  • Input 選項

    選擇你須要混淆加密的 dll、exe文件,其中Library不要勾選,不然有些類、變量等等不會混淆。加密

  • Rename 選項 

    勾選「use enhanced overload induction」(使用加強模式),注意:不要勾選下方的「 Do not suppress on serializable types」,即序列化類型的變量不加密,不然編譯後可能異常; 「Renaming Scheme」 選擇「Unprintable」(不可打印字符,即亂碼),也能夠選擇其餘如小寫字母、大寫字符、數字的方式。spa

  • String Encryption 選項

    include裏勾選須要字符串加密的工程文件exe、dll等。翻譯

  • Settings->Build Settings 選項

    設置輸出目標文件夾,點擊上方的運行按鈕便可從新生成新的 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做爲一款代碼混淆的軟件,具備很強的反編譯功能,但使用時應注意如下幾點:

  1. 若是你加密的dll、exe裏有public類,須要被外部引用的話,那麼引用這個public的相關dll、exe也要一塊兒放到Dotfuscator Input 裏,同時進行混淆加密,否則外部調用出錯。
  2. 若是有public類,可是你不想照着第1點的方式作的話,能夠勾選 Library 模式(input 裏 展開項目,見下圖),或者不選擇 rename 選項,僅僅用 control flow 混淆(該種方式下會看見類名、函數名,可是看不到函數體)。
  3. 若是有public類,可是你也不想按照個人第一點、第二點的方法作的話,能夠在rename選項裏排除這些public的類名、方法名、屬性名便可:使用 rename exclude 裏左側排除項目,或 右側 正則排除方法。

固然若是你編寫的軟件不涉及商業用途的話,本着開源的思想,不推薦使用代碼混淆器。使用代碼混淆器存在必定的風險,在使用前最好作好相關代碼備份。

 

 

補充: https://www.cnblogs.com/ghost79/articles/1565280.html 

C#的代碼辛苦寫出來以後,一個反射工具,就能夠徹底顯露出來。

固然,在作項目時,這個功能還不錯。由於我就曾在一個項目上使用C#,沒有進行任何混淆。結果在項目二年多以後,須要作一些調整,本身保存的源代碼丟失了。當時也嚇了一跳,但是想到反射工具,趕快拿出來用一下。雖然在反射出來會出現一些錯誤,但畢竟大部分代碼也都弄出來了。

這是在項目上,還有好處的,但是,試想一個產品,被別人給反射了,會是怎麼樣的一個狀況,不說他去照搬功能,就是註冊、加密那部分都會被輕易拿到。這可不是什麼一個好主意。

因而,必需要使用代碼混淆器。

C#的代碼混淆器有不少了,好比Dotfuscator、xeoncode、foxit等等。

這些混淆器大可能是須要注意的,使用效果各不相同。普通的代碼混淆器只是把私有字段和變量轉換成隨機碼,若是是小程序,還能夠猜一猜,若是是比較大的程序,猜起來可就不會那容易了。高級一點的是混淆成不可閱讀的字符,這樣的混淆後的代碼乾脆就比機器碼還難懂,基本上是翻譯不出來了。

但這些代碼混淆器都有必定的風險,即混淆後的代碼實然沒法正常調用了。

而我一直用.NET Reactor,這個很是小巧,免安裝,並且不須要註冊。他只是將代碼換成隨機碼,可是混淆後的代碼都能正常使用。

可是有一點須要注意:凡是須要序列化成二進制的代碼,是不能用混淆器的。混淆後的代碼將不能正常序列化!

共享一下這個混淆器:

http://files.cnblogs.com/ghost79/DotNETReactor.rar

相關文章
相關標籤/搜索