示例图片三

新闻资讯

联系方式

加密狗复制克隆网
电  话:13528540969
联系人:  刘先生
Email:4642967@qq.com
网  址:www.crackdongle.com
地  址 :广东省深圳市地王大厦38层8801号

当前位置: 网站首页 > 新闻资讯 > 业界资讯
业界资讯

加密锁控件破解方法

不像可执行文件,Delphi / C++ Builder 的控件是不能利用 SoftIce 进行动态跟踪的,但 
是,这并不意味着控件的破解比可执行文件的破解要困难。 
要想破解一个控件,首先要弄明白它为什么能够产生限制。一般来讲,带有限制的控件 
只能在 IDE 中运行。这就意味着,这个控件必须有一种既定的机制来判断当前执行环境是 
否是在 IDE 内部。Delphi / C++ Builder 的 IDE 具有什么样的特征呢?自从 Delphi 1.0 开 
始,IDE 的主窗口的类名始终没有改变过,一直是 TAppBuilder ,并且,这个窗口没有子窗 
口。几乎所有限制控件都是用这个特征来判断当前是否是在 IDE 内部的。虽然枚举系统中 
的所有进程,并且判断进程文件名是否是 Delphi32.exe 也似乎可行,但是这会在程序执行 
的时候产生明显的延迟,所以目前为止,我还没有发现使用这种方法的实例。 
只要了解了这些,破解控件就成为了可能。实际进行破解的时候,需要两个重要的工具 
软件:DeDe 2.50 和 Ultra Edit ,前者用来分析 DCU 文件,后者用来对二进制文件进行编 
辑。 
下面,我将利用破解 JF Control Delphi 版本的实际例子来说明破解的方法。JF Control 
的未破解版本可以在 http://www.jfactivesoft.com/spindex.htm 下载。 
安装好这套控件以后,我们首先来分析它所有的 DCU 之间的关系。判断限制条件的 
部分必然要被所有其它单元所使用,这样才能保证不管在程序中引用了哪一个单元都能够保 
证程序不能在 IDE 外执行。当然,寻找这个单元并不一定需要使用 DeDe 打开所有 DCU 。 
发现 Delphi\ Lib\JFMain.dcu 了吗?这就是一个再明显不过的标志:这是一个主单元,限制 
条件有很大可能就是在这里判断的。好,我们再使用另外一招:使用资源管理器在 Delphi\Lib 
目录中对文件进行搜索,条件是文件内容包含 TAppBuilder 。如果在程序中要查找 
TAppBuilder 窗口类,就必须用到 FindWindow 函数,这个函数要求传递窗口类的名字字符串, 
在 DCU 中应当有相应的字符串存在。查找的结果,符合条件的文件只有两个: 
JFCtrls_d5.dcp 和 JFMain.dcu 。DCP 是 Delphi Component Package 的缩写,是在 Delphi 
IDE 内部使用的控件包,既然是内部使用的,根本不用去管它。但是,另外一个文件则证 
明了我们刚才的判断,好,准备破解。 
运行 DeDe 程序,在 Dumper 菜单中选择 DCU Dumper ,在打开文件对话框中选择 
JFMain.dcu 。处理完毕以后,在反编译的文本框中全选所有文本并且复制,然后粘贴到记事 
本中。在记事本中查找字符串 TAppBuilder 。寻找的结果好像并不太令人满意: 
const 
szTAppBuilder:System.AnsiString ='О惫紶棩 ?{@_NF_7E5+$8}; 
原来这个字符串是一个常量的名字。常量的内容是不可识别的字符串,显然,加密了。 
但是不要着急,这个字符串的内容并不重要了。偶然向下翻了一屏,惊喜就会出现: 
function JfDelphiIDERunning:System.Boolean; 
万万没想到这个程序编写的居然如此明显。现在看一看这个函数的内容,千万别被骗了。 
这个函数内嵌一个函数:function CnvString (AStr:System.AnsiString):System.AnsiString; 
这就是负责把刚才我们看到的加密字符串解密的函数。继续向下看,函数的主体调用了 
FindWindow,GetWindowText,EnumChildWindows,功能确实符合这个函数的名字。 
下面,我们要做的并不是破解 CnvString 函数,因为要想理解这个函数的算法还是有一 
些难度的,另外,这个函数是内嵌函数,也就是说,在这个单元的其他地方是不需要这个函 
数的。实际上,我们只要修改 JfDelphiIDERunning 的代码,让它只返回 true 就可以了。 
如果有汇编语言的基础,这段简单的程序很容易写出来。如果不会汇编语言,也可以很 
容易解决这个问题:启动 Delphi ,开始一个新的工程,创建一个单元,创建一个如下的函 
数: 
function CrackStub:Boolean; 
begin 
Result:=true; 
end; 
然后编译程序。用 DeDe 打开这个函数所在的 DCU 文件,获得汇编代码:B0 01 C3 。 
下面,我们记录 JfDelphiIDERunning 入口点的代码,应当记录足够长的特征代码,否则 
可能在后面的二进制查找中获得多个结果。我记录的入口点代码是:55 8B EC 81 C4 E8 FE FF 
FF 53 56 57 33 C0 89 85 E8 FE FF FF 89 85 EC FE FF FF 89 85 F0 FE FF FF 89 85 F4 FE FF FF 89 85 
F8 FE FF FF 89 85 FC FE FF FF 。 
启动 Ultra Edit ,打开 JFMain.dcu ,使用二进制 / 十六进制寻找功能,搜索记录的特征 
代码。找到以后,在此搜索,确认特征代码唯一。下面,把入口点位置的代码修改为我们的 
代码。后面的代码我们不需要修改,因为 CPU 执行完 B0 01 C3 就返回了,根本不会继续 
执行。修改完毕,保存文件。我们可以使用 Delphi 打开它的 Demo 程序,然后编译,退 
出 Delphi ,运行 Demo 程序,程序正常启动。破解成功。 
这种对 DCU 文件的破解其实还是有一些限制的:不能使用 BPL 动态程序包。BPL 文 
件实际上是可执行文件的结构,破解方法和 DCU 文件有些区别,破解方法不在这里讨论。

分享到:
点击次数:  更新时间:2018-08-07 09:57:24  【打印此页】  【关闭