C#防止反編譯


http://blog.csdn.net/wangpei421/article/details/42393095

http://www.cnblogs.com/tianguook/archive/2012/10/06/2713105.html

http://zhoufoxcn.blog.51cto.com/792419/163944

 

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,即保證控制流和混淆功能打開,其他默認。如下圖:



Input 選項

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



Rename 選項 

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



String Encryption 選項

include里勾選需要字符串加密的工程文件exe、dll等。



Settings->Build Settings 選項

設置輸出目標文件夾,點擊上方的運行按鈕即可重新生成新的 exe、dll文件了。



接下來來看一下一段簡單的C#代碼加密混淆后的效果:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceConsoleApplication1

{

    classProgram

    {

        staticreadonly

int 
A = B * 10;

        staticreadonly

int 
B = 10;

        //const
 int A = B * 10;

        //const
 int B = 10;

        publicstatic

void 
Main(string[]
 args)

        {

            Person
 p = newPerson();           

            Console.WriteLine("A
 is {0},B is {1} ",
 A, B);

        }

    }

    publicclass

Person

    {

        staticint

age;

    }

}
使用Dotfuscator進行代碼混淆后 我們使用著名的反編譯軟件 Reflector 來查看,可以發現函數體內的代碼已經看不到了,字符串也變成了亂碼,函數名稱也不可見了,效果圖如下: 

總結:

Dotfuscator作為一款代碼混淆的軟件,具有很強的反編譯功能,但使用時應注意以下幾點:

如果你加密的dll、exe里有public類,需要被外部引用的話,那么引用這個public的相關dll、exe也要一起放到Dotfuscator Input 里,同時進行混淆加密,不然外部調用出錯。
如果有public類,但是你不想照着第1點的方式做的話,可以勾選 Library 模式(input 里 展開項目,見下圖),或者不選擇 rename 選項,僅僅用 control flow 混淆(該種方式下會看見類名、函數名,但是看不到函數體)。
如果有public類,但是你也不想按照我的第一點、第二點的方法做的話,可以在rename選項里排除這些public的類名、方法名、屬性名即可:使用 rename exclude 里左側排除項目,或 右側 正則排除方法。
當然如果你編寫的軟件不涉及商業用途的話,本着開源的思想,不推薦使用代碼混淆器。使用代碼混淆器存在一定的風險,在使用前最好做好相關代碼備份。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM