好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.NET源代码的安全性(源代码工具真正比拼)(論)(2)

打字好累,所以废话少讲,我们切入正题。 今天被屠宰的对象就是 我们公司使用 vb.net开发的一套管理系统。名字就不说了,此系统主程序约3M,其中共有约 3000个方法,事件,等等。是一个中大型的程序,源代码约有 5万行左右(去掉一些自动生成的代码计算后)

打字好累,所以废话少讲,我们切入正题。

今天被屠宰的对象就是 我们公司使用 vb.net开发的一套管理系统。名字就不说了,此系统主程序约3M,其中共有约 3000个方法,事件,等等。是一个中大型的程序,源代码约有 5万行左右(去掉一些自动生成的代码计算后),其中有底层硬件操作类,也有水晶报表操作,数据库操作。我们最关心的是其中的一块,注册类,以及一些核心代码。而我们演示的时候将会把注册代码拿出来演示(当然,不是原来的注册代码。。。那个拿出去,BOSS要杀我的)

而代码保护工具的主角是:

1. Dotfuscator Community Edition //微软推荐的东东,我个人认为非常烂

2. XeonCode //最近最好的混淆器,有可取点.它号称安全,我们今

//天来看看是不是真的安全

3. MaxtoCode //一个不同于混淆的.NET源码工具 MaxtoCode

//目前普及版只支持 WindowsApplication的加密

//以后开放 WEB APPlication and Class Library

我们的反编译目标分为二种 :

1. C#语言

2. MSIL语言

使用的全是市场上流通的免费反编译工具 ,我知道收费的反编译工具还会自动还源混淆.收费的我也没有条件去测试

好 ,开始测试:

我们分别使用上面三样对代码进行混淆或加密。

完毕,测试程序所有功能:

1. Dotfuscator Community Edition 我最不喜欢的混淆器,由于是1.2免费版,所以必须混淆所有模块,导致部分功能不能使用。但我们不关心那些,我们一会将展现被混淆的注册代码 (因为类和方法都被混淆,所以必须要花点时间)

2. XeonCode 一个相对强大的混淆工具,我一直认为他与某著名的反编译工具捆绑,导至其它工具能反编译的代码而它不能反编译。我们把它的强度开到最大,勾上所有能勾的选项 。(它混淆的Windows Application可以正常运行)

3. MaxtoCode 这是一个加密器,可以与XeonCode叠加使用,并且在2.0版中,将会加入自混淆功能,成为混淆加密一体化的工具 。(它混淆的 Windows Applicaton 可以正常运行)

我们最关心的是混淆或加密的结果。 OK,请不要急,让我们先看看 源代码 ,再比较一下反编译后的代码。

Private Function Encrypt( ByVal inStr As String ) As String

Dim key As String = "a#2151336fdaghksfges"

Dim out As String

Dim j, i, s As Integer

i = inStr.Length

s = 0

For j = 0 To i - 1

out = out + inStr.Substring(j, 1) + key.Substring(s, 1)

s = s + 1

If s >= 20 Then s = 0

Next

Return out

End Function

Private Function Register( ByVal instr As String ) As String

Dim pRsa As New System.Security.Cryptography.RSACryptoServiceProvider

Dim en As New System.Text.ASCIIEncoding

Return en.GetString(pRsa.Encrypt(en.GetBytes(Encrypt(instr)), False ))

'Dim a As String

'a = Encrypt(instr)

'Dim b() As Byte

'Dim c() As Byte

'b = en.GetBytes(a)

'c = pRsa.Encrypt(b, False)

'Return en.GetString(c)

这里怕大家看不清楚,特别加了展开的代码

End Function

源代码很清楚,即是对字符串进行插入,然后使用 RSA 进行加密(这里省去了RSA的KEY)

好,那么我们首先来看看使用上面三种工具混淆后的 C#代码

1. Dotfuscator Community Edition

 private    string  b( string  A_0)
 
 
 {
 
 
          string  text3;
 
 
          string  text2 =  "a#2151336fdaghksfges" ;  
          int  num1 = A_0. Length ;  
          int  num3 =  0 ;  
          int  num4 = num1 -  1 ;  
          for  ( int  num2 =  0 ; num2   
         {  
               text3 = text3 + A_0. Substring (num2,  1 ) + text2. Substring (num3,  1 );  
               num3++;  
                if  (num3 >=  20 )  
               {  
                     num3 =  0 ;  
               }  
         }  
          return  text3;  
 }  

 private    string  a( string  A_0)  
 {  
          RSACryptoServiceProvider  provider1 =  new   RSACryptoServiceProvider ();  
          ASCIIEncoding  encoding1 =  new   ASCIIEncoding ();  
          return  encoding1. GetString (provider1. Encrypt (encoding1. GetBytes ( this . b (A_0)),  false ));  
 }  

评价 : 跟原代码一模一样,只是混淆了类和方法名称,代码中根本未进行混淆,由于是免费版,也只能提供这么多功能.毫无意义

2. XeonCode

 private string x246b032720dd4c0d(string x96c91b85a03f00b0)  
            {   
                string str2;   
      
                string str3;   
      
                int k;   
      
                int j;   
      
                str2 = String.Intern(x1110bdd110cdcea4._d574bb1a8f3e9cbc("/uec3b/uf2fa/ufa06/u0102/u0803/u0efc/u15fb/u1cf8/u23f8/u2b25/u3220/u391a/u401d/u471b/u4e1b/u5520/u5c10/u630e/u6a09/u7114", 281144282));   
                int i1 = x96c91b85a03f00b0.Length;   
                k = 0;   
                  i2 = i1 - 1;   
                j = 0;   
                goto IL_003c;   
                VariableExp: k   
                ConstantExp: 20   
          IL_0029:    blt.s        IL_0038    //自动的跳转混合   
                k = 0;   
                goto IL_0038;        //花指令   
                ConstantExp: 1   
          IL_0031:    add.ovf         
          IL_0032:    stloc.s      5   
                VariableExp: k   
                int j;   
      
                int i2;   
      
  IL_0038:   
                j++;   
                if (j > i2)   
                {   
                    return str3;   
                }   
                str3 = String.Concat(str3, x96c91b85a03f00b0.Substring(j, 1), str2.Substring(k, 1));   
            }   

 private    string  x2a0cb95ab84ba877( string  x5b3e4cba383dedd9)  
 {  
          RSACryptoServiceProvider  provider1 =  new   RSACryptoServiceProvider ();  
          ASCIIEncoding  encoding1 =  new   ASCIIEncoding ();  
          return  encoding1. GetString (provider1. Encrypt (encoding1. GetBytes ( this . x246b032720dd4c0d (x5b3e4cba383dedd9)),  false ));  
 }  
    
 评价 : 功能强大许多,对于较长的代码会加入花指令进行混淆,从而达到混淆反编译器的目地.            这种混淆已经是XeonCode的最大混淆较果,虽然有达到混淆反编译的较果,但耐心仔细的看,并结合IL           代码一起阅读   ,想得到其其算法是一件很容易的事情,最重要的是,      有某些反编译器竟然可以去掉花指令,从而达反混淆的较果.      所以使用它来保护你的知识版权是不是还不够强大呢?    
    

3. MaxtoCode

 private    string  Encrypt( string  inStr)  
 {  
 }  
    
 private    string  Register( string  instr)  
 {  
 }  
    
 评价 : 代码呢????代码已经不见了……不过这就是MaxtoCode的功效,它是加密,不是混淆,你看不到代码了,      你完全无法入手去分析,那怕一点珠丝马迹都没有.您还可以结合XeonCode一起使用,      达到双重的保护(因为现版本的MaxtoCode不提供混淆功能,您能清楚的看到类及方法的正确名称)    
    
  好   ,刚刚展现的是反编译出来的C#代码,那么,我们再深入一点,真接反汇编为MSIL代码看看能达到什么较果    
 待继。。。    

查看更多关于.NET源代码的安全性(源代码工具真正比拼)(論)(2)的详细内容...

  阅读:35次