.NET相关产品

.NET混淆加密

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

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

今天被屠宰的对象就是 我们公司使用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 <= num4; 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代码看看能达到什么较果

待继。。。

发表于 @ 2005年04月14日 11:08:00|评论(loading...)

新一篇: .NET 源代码的安全性(源代码工具真正比拼) (論)(3) | 旧一篇: .NET 源代码的安全性(源代码工具真正比拼) (論)(1)

用户操作
[即时聊天] [发私信] [加为好友]
Jason.NET
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
Jason.NET的公告
时间就是金钱.为什么一天没有48小时? Maxtocode主站点
文章分类
收藏
    存档
    软件项目交易
    Csdn Blog version 3.1a
    Copyright © Jason.NET