破解ComonentArt License Manage 流水账。破解思路。

首先允许我对大家表示深切的歉意。这几天单位派我出差,去了一次安徽省省会合肥市,那里有一家与单位母公司的一个关系企业,是个软件公司,我去负责教他们使用InstallShield,我在那边根本无法写文章。
我知道大家这几天一直在焦急地等待,因为许多人对ComponentArt的控件非常感兴趣。

好,现在开始。
首先,我的方法是使用自己做的 ComponentArt.Licensing.Manager.exe 来代替ComponentArt的ComponentArt.Licensing.Manager.exe 程序来欺骗安装文件。
具体的官方ComponentArt.Licensing.Manager.exe验证过程分析在 这里 ,里面有已经写好的替代注册机的源代码。下载地址在上面给出的链接位置里面。解决方案资源管理器抓图如下:


上面的图说明了破解的解决方案里面有两个项目,第一个项目 ComponentArt.Licensing.Manager 是我写好的破解程序,下面的项目 Licensing.Manager 是没有破解的,我用来与第一个项目做对照,大家可以轮流单步调试这两个项目,就可以了解我的破解方法。
所以,第一个项目 ComponentArt.Licensing.Manager 生成的 ComponentArt.Licensing.Manager.exe 文件就是需要的破解文件。

先说一下破解思路。
上一篇文章 可以看出,在安装ComponentArt软件时,使用InstallShield做出的安装程序中,有一个选择窗口,如下:


如果如果选中上面的输入License Key选项,则安装程序会检查你的注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\ComponentArt\Web.UI for ASP.NET\2.0 中的 Keygen项,从而检查安装的类型,是普通安装、有限时安装、还是无限制安装。那么重点就是如何让注册程序生成这个Keygen。

在上一篇文章可以看出,生成KeyGen最重要的是有4个类,他们是
LicenseCollection -- 是LicenseCollectionItem的集合,注册的软件可以是有许多的许可,如Menu,TreeView等。
LicenseCollectionIte -- 用检查并生成单个的许可,如Menu控件许可,读取 LicenseData中的Licenses表。
RegistryTokenCollectionItem -- 用来生成Menu等单个控件的产品信息,并生成注册的Token。
RegistryTokenCollection -- 用来保存RegistryTokenCollectionItem的集合。

而最重要的两个破解的地方,分别是
LicenseCollectionItem的Key属性的位置和RegistryTokenCollection的构造函数位置。

原理是注册的时候,首先生成一个LicenseCollectionItem的新对象实例,生成实例的时候,执行初始化的一些数据注册表的路径,匹配控件类型的数组,和与注册码比较的LicenseData类等,还有就是生成了一个RegistryTokenCollection类的实例,准备用来保存生成的Product信息。然后开始第一次验证。

第一次验证的执行代码就是把用户输入的注册码赋值给LicenseCollectionItem的Key属性时执行。根据用户输入的注册码经过计算生成License的关键字,生成License的名称,生成用户类型,生成此版本安装时是否包含源代码等,这个过程就是根据注册码经过运算后在LicenseData这个DataSet类中查找数据。如果在运算过程中生成错误或在DataSet中找不到数据,则验证失败。这一次验证就是生成License信息。

在Key这个属性的 set代码中,如果上面的验证都通过了,在代码的后面还有一个代码:
_registrytokenscollection.Load(_licensekey, _licensecode);

它实际上是先执行一次注册表验证,看看是否有已经注册的信息(执行循环检查)。如果没有,就执行建立一个新的RegistryTokenCollectionItem类的实例,在构造函数中,执行第二次验证,同时生成保存在注册表内的加密字符串,以RegistryTokenCollectionItem.Token属性输出。

最后,如果全部通过,则控制转向注册窗体,在注册主窗口内显示注册过的控件的列表,然后当用户单击保存退出的时候,把保存在RegistryTokenCollection类内的已经经过加密的字符串保存在注册表中,一个验证过程结束。

知道了验证过程,那么破解就好办了,既然上面说的两次验证过程都是根据用户输入的注册码经过计算从LicenseData中查询后赋予本地变量,那么我们就可以不进行查询,直接赋值本地变量。

这就是我的破解方法:就是在LicenseCollectionItem类中的Key属性的set操作,与RegistryTokenCollectionItem构造函数内的查找操作全部使用直接赋值的方式。如
// 指示是否包含源代码

// 原来是使用一个方法通过查询获取
_issourcecode = SourceCodeTypeFromCode(_licensecode);

// 经过修改,我直接赋值
_issourcecode = true;

// 原来的过期时间通过注册码运算得出
_expiry = KeyEncoding.ExpiryDateFromKey(_licensekey);

// 现在直接赋值,9999年12月31日
_expiry = DateTime.MaxValue;

这样大家就应该知道了,我的办法是直接跳过了注册码的验证计算,直接让程序生成Token的注册表值,然后通过窗体的“保存退出”的操作写入本地计算机的注册表中,以完成注册。

但是,注册表值写入了,却无法使用,原因是在HKEY_LOCAL_MACHINE\SOFTWARE\ComponentArt\Web.UI for ASP.NET\2.0 中,不但有名为Token的加密注册值,还有一个名为 Licenses 的值,它保存着用户输入的注册码的原文。而使用ComponentArt的Menu,TreeView等服务器控件的时候,它每次运行的时候都要读取这个注册表重新根据注册表的两个内容进行一次匹配运算,而这个运算绝对无法通过。所以说,我做的这个软件不是注册机,它仅仅是一个欺骗程序

那么,这个软件不是没有用了吗?不是的,我早就说过,它是欺骗InstallShield安装程序的。最上面贴图在安装ComponentArt的时候不是有个选择吗,如果选择输入License Key,就启动注册机,注册通过就安装源代码。
那就好,我们当安装ComponentArt的时候,在


上面画面出来的时候,用自己写的ComponentArt.Licensing.Manager.exe来代替官方的.exe程序,则可以完成注册。原理是InstallShield运行的时候,实际上是先把安装文件setup.exe中包含的全部执行文件解压到一个临时文件内,然后才执行的,那么只要替换这个文件,就可以让安装程序以为我们已经注册,安装全部源代码。

注册方法如下:
1 先运行我写的破解项目,生成 ComponentArt.Licensing.Manager.exe程序。
2 运行ComponentArt的安装程序,如果已经安装,先删除它,再安装。
3 定位到 C:\Documents and Settings\Administrator\Local Settings\Temp 文件夹,里面有几个文件夹,是以GUID值作为文件名的,类似于这样:{3A539704-A3A2-4F21-8BDE-7A685D462E22} ,这个值是随机生成的,每个人的值都不一样,每个人的这个目录下有可能有多个这样的目录,我的电脑上就有三个,如下图


进入这样的目录,然后找到 ComponentArt.Licensing.Manager.exe,程序。
4  新开一个“我的电脑”窗口,定位到原先运行好的vs.net解项目中,打开bin文件夹,把里面的ComponentArt.Licensing.Manager.exe文件复制并粘贴到 C:\Documents and Settings\Administrator\Local Settings\Temp 中临时目录中文件,替换掉官方的文件。
5 切换到安装程序,选择第一项,然后单击下一步,ComponentArt.Licensing.Manager.exe运行,然后直接验证后,选择“保存退出”。
6 在安装程序中选择安装类型是切记选择第一项,这样才能安装源代码。
7 安装完毕,定位到安装目录,会发现有个source_code文件夹,里面就是控件源代码。

祝大家使用愉快。

posted on 2004-10-23 21:50  笑望人生  阅读(8354)  评论(37编辑  收藏  举报

导航