.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  b( A_0)
{
       text3;
       text2 = "a#2151336fdaghksfges";

       num1 = A_0.;

       num3 = 0;

       num4 = num1 - 1;

      for ( num2 = 0; num2 <= num4; num2++)

      {

            text3 = text3 + A_0.(num2, 1) + text2.(num3, 1);

            num3++;

            if (num3 >= 20)

            {

                  num3 = 0;

            }

      }

      return text3;

}

 

private  a( A_0)

{

       provider1 = new ();

       encoding1 = new ();

      return encoding1.(provider1.(encoding1.(this.(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  x2a0cb95ab84ba877( x5b3e4cba383dedd9)

{

       provider1 = new ();

       encoding1 = new ();

      return encoding1.(provider1.(encoding1.(this.(x5b3e4cba383dedd9)), false));

}

 

評價:

 

3.   MaxtoCode

private  Encrypt( inStr)

{

}

 

private  Register( instr)

{

}

 

評價:

 

,剛剛展現的是反編譯出來的C#代碼,那麼,我們再深入一點,真接反彙編爲MSIL代碼看看能達到什麼較果

待繼。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章