Dundas OLAP Service v5.5破解
很久以前,抱着学习的态度,对Dundas 4.5进行过破解.很久不关注Dundas了,最近发现他推出了一个OLAP Service v5.5,可以对数据进行OLAP分析,并且能以直观的各种图形将结果/报表显示出来,看他的介绍使用起来也特别简单.于是便下载进行试用.当安装完Dundas OLAP Service v5.5之后,在VS Studio的Toolbox里面会增加如下控件
大概看了看,Dundas的水印信息依然存在,心里暗暗笑了笑.但是在将最重要的OlapClient,OlapGrid拖动到设计器的时候,VS会报如下类似错误:
看样子,除了水印以外,Dundas如今增加了新的保护版权的办法.现在这两个控件都提示过期,无法使用.看来要试用下他的OLAP相关东西又得下点功夫了.于是又抱着学习研究的态度,尝试着破解掉他进行试用!Let's go~~
一. 拆散 组装
进行破解的时候,我有一个习惯.不管什么.net程序,我会先反编译成IL,去掉publickey,然后再编译成新的DLL.其他什么都不动.看这个"破解"的DLL是否能够使用.(因为有好几次,我拿到一个DLL,去分析了半天,有了一定破解思路后,开始动手,确发现反编译出来的IL无论如何也编译不回去,由于自己对混淆技术不熟悉,只能作罢,从而白白浪费很多时间)
这次也一样,首先,我将Dundas安装完后bin2005中的DundasOlapWinUIControls.dll进行反编译,然后去掉publickey,然后在编译回去,这个时候,我最担心的事情出现了:
看来Dundas越来越注意自己产品的保护,混淆技术也越来越严密.没办法,硬着头皮打开IL常识着寻求下原因吧.工夫不负有心人,发现在IL接近结尾的地方,有如下Instance的申明:
具体混淆技术与原因我也不是特别清楚,只能尝试将IL中所有(UNKNOWN_OWNER)去掉,然后再进行编译...过了:)哈哈.暂时死马当作活马医吧.其他几个DLL也有类似的问题,同样去掉(UNKNOWN_OWNER)后编译回去.在这一步,还有一点值得注意的就是,Dundas在进行开发的时候,各个程序集都采用了strong name.所以在所有DLL的IL中关于引用其他Dundas程序集的地方,要注意去掉publickeytoken,不然的话仍无法使用控件,VS会提示你找不到程序集的相关依赖.例如:在DundasOlapWinUIControls.dll的Metadata中,关于引用的部分,可以看到如下引用:.custom (UNKNOWN_OWNER) instance void [System]System.ComponentModel.DescriptionAttribute::.ctor(string)
= ( 01 00 1E 54 68 65 20 68 65 69 67 68 74 20 6F 66 // ...The height of 20 61 20 73 65 70 61 72 61 74 6F 72 20 69 74 65 // a separator ite 6D 00 00 )
.assembly extern DundasWinChart { .publickeytoken = (A4 C0 3D CE 5D B2 24 06 ) // ..=.].$. .ver 5:5:0:1697 }
这就说明DundasOlapWinUIControls.dll引用了DundasWinChart程序集,并且是一个强命名的程序集.但由于我们可能要对DundasWinChart进行破解,所以我们就要把.publickeytoken去掉.
好了.我们针对bin2005中的所有DLL进行这一步操作之后,破解的半成品就已经准备好了:)进行下一步吧.
二 需要破解什么?
在上面,我提到了关于控件过期的问题,并且VS2005也有相关提示.好!就从他开始吧.刚开始的时候,用Reflector.NET研究各个DLL,但是由于混淆的问题,实在找不到地方下手.头晕眼花之时,又看了一眼过期提示信息~哇哈哈.一拍脑袋...Dundas留给我们一个这么好的信息,我咋刚开始就没重视呢?在过期信息中,我们可以看到Tracestack的信息,也就是那几句"at DOS01...at...Dundas.Olap.....".哈哈.线索来了,于是Reflector再次登场,打开DundasOlapWinUIControls.dll,找到DOS01名称空间,定位到一个名字被混淆为ab的类,在他的构造方法中,我们可以很清晰的看到如下内容:
哈哈.根源找到了.动手吧,在IL文件中搜索"LicenseException",哈.居然就一个,相关IL代码如下:
IL_0107: stloc.2 IL_0108: ldloca.s V_2 IL_010a: call instance int32 [mscorlib]System.TimeSpan::get_Days() IL_010f: ldc.i4.s 90 IL_0111: ble.s IL_012e IL_0113: ldtoken DOS01.ab IL_0118: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) IL_011d: ldarg.0 IL_011e: ldstr bytearray (BD 14 D1 14 CE 14 89 14 CE 14 DF 14 CA 14 D5 14 DE 14 CA 14 DD 14 D2 14 D8 14 D7 14 89 14 DF 14 CE 14 DB 14 DC 14 D2 14 D8 14 D7 14 89 14 D2 14 DC 14 89 14 CE 14 E1 14 D9 14 D2 14 DB 14 CE 14 CD 14 97 14 ) IL_0123: call string DOS01.af::a$PST0600060C(string) IL_0128: newobj instance void [System]System.ComponentModel.LicenseException::.ctor(class [mscorlib]System.Type,object,string) IL_012d: throw IL_012e: ret
在IL_010f:地址处,我们看到载入变量90,然后与前面一步通过get_Days方法得到的变量进行比较.如果前者大于后者,则跳转到IL_012e地址处.出于方便起见,我进行如下修改: 将IL_0111: ble.s IL_012e这条跳转语句修改为IL_0111: ble.s IL_0113.删除IL_0113到IL_012d的所有代码,将最后那句return IL 代码的地址修改为IL_0113.
OK.工作完成,将IL编译成DLL,并将原版DLL覆盖,然后再进行测试.过期的提示没有了:)现在可以使用OlapClient和OlapGrid控件了.
控件过期问题解决了.原本认为水印的问题和原来一样.但是按照原来的方法破解之后,发现控件无法使用,无法拖动到设计器中.关于这点,再研究...
三 收尾工作
完成破解后,记得双手合十,口中默念"支持正版!学习第一,破解第二!" :)

浙公网安备 33010602011771号