打字好累,所以廢話少講,我們切入正題。
今天被屠宰的對象就是 我們公司使用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代碼看看能達到什麼較果
待繼。。。