• 标 题:VS.NET IDE重构代码插件C# Refactory的破解  
  • 作 者:jk
  • 时 间:2003/08/05 10:14am 
  • 链 接:http://bbs.pediy.com

VS.NET IDE重构代码插件C# Refactory的破解
Jance

好几年没玩破解了,最近在候SIR的主页(http://www.jjhou.com)上看到最近翻的一本书,《Refactoring》特

别感兴趣。碰巧找到了个在VS.NET下的重构代码的插件C# Refactory。试用下感觉挺方便的,于是就有了下面

这篇很随意的破文。^_^

软件:Xtreme Simplicity's C# Refactory插件
开发公司:http://www.xtreme-simplicity.net/
软件介绍:C# Refactory is a refactoring, metrics and productivity add-in for Microsoft Visual

Studio.NET。
开发语言:C# OR VB.NET
软件限制:Nag、15天试用


破解工具:
1.Lutz Roeder's .NET Reflector(以下称为Reflector)个人以为目前最好的免费.Net IL代码反编译工具
2.Net Framework自带的ildasm和ilasm

先安装好C# Refactory,再到软件主页上申请一段激活信息,输进去就能试用15天了。OK,在开始之前让我们整

理下破解的思路,这样在后面的破解过程就会有个很明确的目的。根据一般的经验,这段激活信息应该会包含

过期的时间,激活的类型,比如是试用的,还是正式的,等等。试想下,如果我们能解开这段信息包含内容,

以及生成的方法,那么我们就有可能(只是说有可能...:P)根据这个方法,生成能正式激活的注册信息了。如

果能用这种方法破解的话,那就是最完美的了。思路是这样的

Step 1 分析注册激活信息->
Step 2 分析注册激活信息的解码过程->
Step 3 分析注册信息包含的内容->
Step 4 分析生成注册信息的方法->
此时就可以决定是否能生成这段注册信息了

好的,下面就随着这个步骤,看看能否获取生成激活信息的方法

Setp 1 分析注册激活信息:
首先从激活信息来看,由两部份构成,分别是id key和activation code,像我的分别是:
id key: CRL815527      
activation code:

wACIijzES9UtDvBet3HCN1gZPtFoFsNwA3wsFo8UiAH4WKexwixzGcgUAOHfjsblQDSkT8QqtoLnAA1wZqmtgkAH2ZrFsadmi

T0F8
看一下,看不出什么名堂,:P那就过吧

Step 2 分析注册激活信息的解码过程:
这部份要有点耐心,要用Lutz Roeder's .NET Reflector反编译软件代码。Reflector可以把IL

Decompiler为C#或VB.NET,因为对C#比较熟悉,所以以下的代码都是用C#.最终你会找到下面这个关键的类:
---)RefactoryCommon.DLL里的XtremeSimplicity.Common.Activation.ActivationKey
里面有一些我们感兴趣的东西:
private string Encode(string privateXmlKey, DateTime dateTime, string idkey, int flags)
private void Decode(string keyString, string idkey, [out] ref DateTime dateTime, [out] ref int

flags)
public bool Demo { get; }
public int Flags { get; }
public DateTime DateTime { get; }
这些代码差不多跟源码一样,如果你懂点C#基础知识的话,应该很容易就能读懂.其中Encode就是生成activation

code的方法(Method),他有4个参数,分别是privateXmlKey包含RSA加密算法里的私钥信息;dateTime包含软件过

期时间;idkey包含激活信息的id key,比如上面的CRL815527;flags可能是激活类型标志.从这里我们可以知道,

如果要生成激活信息,我们必须知道privateXmlKey,而实际上作者不会把这个放到软件里的,软件里放的是Publi

cXmlKey,用来解开激活信息.这点,你可以慢慢找,反正你耐心点看看,就知道里面的这些过程.而这个也是采用RS

A之类的公开密钥方式生成注册信息的优点,你基本上不能通过反汇编程序来知道注册信息的生成算法,从而生成

注册信息.
到这我们知道,刚才想的这条路是走不通的.因为我们不可能得知privateXmlKey.
既然我们不能算出激活信息,那么我们现在就要换种思路,退而求其次的方法是绕过程序检查过期时间的代码,那

就是平常所说的暴破的方法,也就是直接修改程序代码的破解方法.

OK,也让我们整理一下暴破的思路:
Step 1:Decompiler软件,找到检查激活信息的代码
Step 2:写出修改检查的代码,绕过这段程序
Step 3:用ILDASM Disassembler程序,然后把Step 2里写好的代码替换原来的
Step 4:用ILASM 把*.IL文件assembler成*.DLL文件
再把这个替换原来的.

如果一切顺利,那我们就能成功破解了!:)
好了,思路有了,那就让我们用Reflector来找这段代码.
如果你有耐心的话,那么很快就会找到下面这个关键Method:

---)XtremeSimplicityCSharpRefactory.DLL里的XtremeSimplicity.Addin.Refactory
里面有个Method:CheckActivation是我们感兴趣的.下面是Reflector反编译的C#源码.
private bool CheckActivation(ext_ConnectMode connectMode)
{
RegistryKey key1;
string text1;
string text2;
ActivationKey key2;
bool flag1;
DateTime time1;
key1 = Registry.CurrentUser.CreateSubKey("Software\XtremeSimplicity\C# Refactory");

L_0010:
text1 = ((string) key1.Getvalue("LicenseKey", ""));
text2 = ((string) key1.Getvalue("ActivationKey", ""));
if (text1.Equals(string.Empty))
{
if (ActivationDialog.Execute(this, 0) == 2)
{
flag1 = false;
goto L_00B1;

}

}
else
{ key2 = new ActivationKey(text1, text2);
Global.Demo = key2.Demo;
time1 = DateTime.Now;
if (DateTime.op_GreaterThanOrEqual(key2.DateTime, time1.Date))
{
if (connectMode != 5)
{
new DemoDialog().ShowDialog(this);

}
flag1 = true;
goto L_00B1;

}
if (ActivationDialog.Execute(this, 1) == 2)
{
flag1 = false;
goto L_00B1;

}

}
goto L_0010;

L_00B1:
return flag1;
}

源码很简单,我们要把这段代码修改一个,像我就把下面这段改成:
private bool CheckActivation(ext_ConnectMode connectMode)
{
Global.Demo = false;/*这里我是输false,不过可能true也行,看不出Global.Demo有什么作用*/
return true;
}
当然这要写成IL语言,这样才能用ILASM汇编.这样IL就会是像下面这样的:

private bool CheckActivation(ext_ConnectMode connectMode);

.maxstack 3
L_0000: ldc.i4.0
L_0001: stsfld Global.Demo
L_0006: ldc.i4.1
L_0007: ret  

在Reflector里,想看一个IL语句的作用,你可以把光标移动语句的上面,就会显示相关语句的说明.

OK,让我们继续,该是Step3了
ILDASM和ILASM的用法比较简单,这里就不详细说了,这样我们会得到一个修改后的XtremeSimplicityCSharpRefa

ctory.DLL,把原来的备份,再用这个覆盖原来的,好了!再让我们启动VS.NET检验一下我们的破解成果如何!
VS.NET在装载C# Refactory插件时,会产生一个未知错误,错误代码是80131522,OK,让我们看看80131522错误代

码表示什么意思,直接在google里输入80131522,选择"搜索所有网站".
在第一条信息是:
p2p.wrox.com - vb_dotnet archive
... However I still get the > > same problem, "Run-time error '-2146233054 (80131522)': No server

> registered
> > or could not load class for CLSID". ... > > > > > I got the message "Run-time error

'-2146233054
(80131522)': No server > > > > registered or could not load class for CLSID". ...
p2p.wrox.com/archive/vb_dotnet/2002-03/20.asp - 18k - 网页快照 - 类似网页

注意这条信息就是我们要的:No server > registered
> > or could not load class for CLSID
意思是控件没注册或者是不能装载相关CLSID的控件.知道了这个原因,那我们就查注册表,看看XtremeSimplicit

yCSharpRefactory.DLL是怎样注册为控件的.
直接查找"XtremeSimplicityCSharpRefactory.DLL",你能找到两个相关的键,其中一个为{C9A3A709-E578-466C-

AAEA-2C14B93D5CAD},在这个键下的InprocServer32里,可以找到这样一个值:
数值名称:Assembly
数值数据:XtremeSimplicityCSharpRefactory, Version=1.0.1265.920, Culture=neutral,

PublicKeyToken=7d5f0a845d151407

在这里有一个东西引起了我们的注意,PublicKeyToken=7d5f0a845d151407.通过查找MSDN,知道这是使用强名称

为程序集进行了签名.这方面的信息,你可以在VS.NET自带的MSDN里输入"强名称"来查看.
一个程序集一旦用强名称进行了签名,那么就不能修改里面的内容,否则.Net Framework装载程序集时,查检签名

时,发现程序集被修改了,就不能装载.所以这里就出来了这么个问题,怎么样去掉一个程序集的强名称签名.
通过对使用和不使用强名称签名的相同代码的程序的对比,我们发现在使用强名称签名的程序集的IL代码里多了

下面这个内容:
 .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00   // .$..............
               00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00   // .$..RSA1........
               2D E5 AE 96 82 E6 6E 20 6D 70 B5 33 5D 5C 48 6D   // -.....n mp.3]\Hm
               5C DE 75 0E E3 87 01 0A 66 05 ED E9 3B 33 10 DD   // \.u.....f...;3..
               95 84 A5 30 43 F2 49 84 AF 0A 42 A8 BD 51 33 8B   // ...0C.I...B..Q3.
               0B 6C 3A 77 18 25 56 8A 66 AA 7D 03 1B B9 E1 42   // .l:w.%V.f.}....B
               06 D8 4C 0B 75 8B F9 46 BC A4 9E 63 A1 CD 8B 60   // ..L.u..F...c...`
               E1 62 44 8B EC F9 D9 65 1F E4 0B 1A 17 C7 5D 21   // .bD....e......]!
               E3 D7 18 B4 28 BD 3C 5D 72 FF 4A B7 9E FA 3A FC   // ....(.<]r.J...:.
               62 65 0A 7D F1 66 96 C6 26 04 A2 19 1C 5F 50 DE ) // be.}.f..&...._P.

我们只要把以上内容去掉,再用ILASM重新编译,就可以去掉强名称签名.
OK,让我们把STEP 3,STEP 4再来一遍,再把生成的XtremeSimplicityCSharpRefactory.DLL覆盖原来的.最后一步

把注册里的两处控件注册信息里的PublicKeyToken修改成null.像下面这样:
数值名称:Assembly
数值数据:XtremeSimplicityCSharpRefactory, Version=1.0.1265.920, Culture=neutral,

PublicKeyToken=null

这样修改了之后,你可以调时间看看,启动的NAG没有了,把时间调到15天后也不会过期了,说明用暴破的方法成功

去掉了Nag和过期的限制.

后记:写得很匆忙,有什么问题可以来信交流linjance@msn.com
基本上我觉得.Net程序的破解会比以前的更容易,主要是我们可以把IL语言反编译成可读性极好的C#之类的源码

.就像上面这个例子,我们几乎不用花什么力气就能知道程序的注册机制,及检查注册信息的地方,这在以前往往

是最费精力的地方,现在变得异常简单.主要给我们造成一些麻烦的是.Net里的强名称签名,不过,我们通过简单

的分析,就能找到去掉的方法.和JAVA的一样,现在的.Net程序的一些保护方法也就是把一些变量名,方法名,类名

打乱掉,变成毫无意义的名称.不过,这对有经验的Cracker来说,只不过是多花点时间而已.同时也应该看到.Net

程序的破解思路和以前的程序有些不同,以前做为主要手段的动态跟踪,变成了现在的静态反编译.因为反编译过

来的代码可读性非常好,就好像没有动态跟踪的必要了.当然这只是我的一已之见,如果各位朋友有什么问题也可

以来信交流!