一、介绍
VGScene 是KSDEV 公司出品的Delphi 控件,是一款三维动画制作软件,为所有图形应用开发提供了:一个图形编辑器IDE,图形对象,简化动画,先进窗口和控制,最高性能,剥皮引擎,位图效果。 VGScene可作为开发工具,用于监控系统,地理信息系统,计算机辅助设计与信息应用。
同时该公司还提供了 DXScene 与Flash Engine 控件。
公司网址:http://www.ksdev.com
二、试用版说明
从KSDEV公式网站上下载的 VGScene 4.05 试用版在安装控件以及使用该控件后编译的程序运行时都会提示一个试用版提示框,如下:
一般来讲,从公司网站上下载的试用版所包含的功能是与正式版一样的,只不过是通过某种手段限制某些功能不可使用,或出现试用版的提示等,并非不包含正式版的功能(后便将说明我的猜测),那么,从VGScene试用版的表现上看,只要将这个讨厌的提示框去掉,就不影响正常使用
三、分析
为了要去掉这个提示框,首先我们要找到这个提示框在哪里。查看控件的单元文件发现一个文件叫vg_version.dcu,感觉提示框应该与这个单元文件有关,使用DeDe对其进行DUMP ,结果发现该单元文件中包含两个过程:procedure ShowVersion; 与
procedure ShowVersion2; 两个过程中都定义了字符串常量,一眼就能看出,ShowVersion 显示的是正版信息,而ShowVersion2显示的是上图显示的试用版信息。
找到提示信息后,再查看该单元文件的其他函数,并没有发现调用ShowVersion或ShowVersion2的函数,说明试用版提示信息是在别的单元文件中调用的。看来还得继续寻找。
由于控件在安装,或编译后的EXE执行时都显示提示信息,那么说明控件中必有一个单元文件总是被引用。一般情况下,都是控件的主单元文件。再查看控件的文件,发现一个与控件同名的单元文件,vg_scene.dcu。这个单元文件的嫌疑最大,使用DeDe进行DUMP后,查找ShowVersion2,结果发现,ShowVersion2真的是在该单元文件中调用的,调用的前后代码如下:
000000C6 : E8(00 00 00 00 CALL RegisterClasses{0xD8}
000000CB : A1(00 00 00 00 MOV EAX,DWORD PTR [_DV_TvgBrushObject{0x5B3}]
000000D0 : 89 45 B8 MOV DWORD PTR [EBP-72],EAX
000000D3 : A1(00 00 00 00 MOV EAX,DWORD PTR [_DV_TvgPathObject{0x5B5}]
000000D8 : 89 45 BC MOV DWORD PTR [EBP-68],EAX
000000DB : A1(00 00 00 00 MOV EAX,DWORD PTR [_DV_TvgBitmapObject{0x5B7}]
000000E0 : 89 45 C0 MOV DWORD PTR [EBP-64],EAX
000000E3 : 8D 55 B8 LEA EDX,DWORD PTR [EBP-72]
000000E6 : B9 02 00 00 00 MOV ECX,$00000002
000000EB : B8(C0 01 00 00 MOV EAX,vg_scene{0x1}+448
000000F0 : E8(00 00 00 00 CALL RegisterVGObjects{0x63F}
000000F5 : E8(00 00 00 00 CALL ShowVersion2{0x347}
000000FA : 68(CC 01 00 00 PUSH vg_scene{0x1}+460
000000FF : E8(00 00 00 00 CALL LoadLibrary{0x299}
通过查看代码可以看出来,vg_scene.dcu 单元并没有进行判断,只是简单的调用ShowVersion2显示试用版信息。
通过以上分析,我们得出结论,破解VGScene控件,可以通过两个方法来实现:
1、 修改vg_scene.dcu 单元,使其不调用ShowVersion2方法即可。
2、 修改vg_version.dcu单元,将ShowVersion2方法直接返回即可。
方法2的好处显而易见,修改完的vg_version.dcu文件,如果KSDEV公司不修改注册方法的话,再有新版本直接使用vg_version.dcu文件覆盖原文件,再重新编译即可实现破解。
四、破解过程
1、 用Delphi建立一个程序,在该程序的主单元文件中写一个空的过程ShowVersion,代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure ShowVersion;
implementation
{$R *.dfm}
procedure ShowVersion;
begin
end;
end.
编译后,使用DeDe对Unit1.dcu进行Dump,找到ShowVersion过程,代码如下:
procedure ShowVersion;
begin
00000000 : // -- Line #27 --
00000000 : C3 RET NEAR
end;
获得RET NEAR 的汇编代码为 C3 。
2、 使用DeDe对 vg_version.dcu文件进行Dump,找到ShowVersion2过程,代码如下:
procedure ShowVersion2;
const
AboutText =
000: P...This app|FF FF FF FF 50 01 00 00 54 68 69 73 20 61 70 70|
010: lication uses a |6C 69 63 61 74 69 6F 6E 20 75 73 65 73 20 61 20|
020: trial version of|74 72 69 61 6C 20 76 65 72 73 69 6F 6E 20 6F 66|
030: VGScene.....Ple|20 56 47 53 63 65 6E 65 2E 0D 0A 0D 0A 50 6C 65|
040: ase contact the |61 73 65 20 63 6F 6E 74 61 63 74 20 74 68 65 20|
050: provider of the |70 72 6F 76 69 64 65 72 20 6F 66 20 74 68 65 20|
060: application for |61 70 70 6C 69 63 61 74 69 6F 6E 20 66 6F 72 20|
070: a registered ver|61 20 72 65 67 69 73 74 65 72 65 64 20 76 65 72|
080: sion.....%s..Cop|73 69 6F 6E 2E 0D 0A 0D 0A 25 73 0D 0A 43 6F 70|
090: yright (C) 1998-|79 72 69 67 68 74 20 28 43 29 20 31 39 39 38 2D|
0A0: 2009 by Eugene K|32 30 30 39 20 62 79 20 45 75 67 65 6E 65 20 4B|
0B0: ryukov....For co|72 79 75 6B 6F 76 0D 0A 0D 0A 46 6F 72 20 63 6F|
0C0: nditions of dist|6E 64 69 74 69 6F 6E 73 20 6F 66 20 64 69 73 74|
0D0: ribution and use|72 69 62 75 74 69 6F 6E 20 61 6E 64 20 75 73 65|
0E0: , see LICENSE.TX|2C 20 73 65 65 20 4C 49 43 45 4E 53 45 2E 54 58|
0F0: T.....Visit our |54 2E 0D 0A 0D 0A 56 69 73 69 74 20 6F 75 72 20|
100: web site for the|77 65 62 20 73 69 74 65 20 66 6F 72 20 74 68 65|
110: latest versions|20 6C 61 74 65 73 74 20 76 65 72 73 69 6F 6E 73|
120: of VGScene:....|20 6F 66 20 56 47 53 63 65 6E 65 3A 0D 0A 0D 0A|
130: http://www.ksdev|68 74 74 70 3A 2F 2F 77 77 77 2E 6B 73 64 65 76|
140: .com/..support@k|2E 63 6F 6D 2F 0D 0A 73 75 70 70 6F 72 74 40 6B|
150: sdev.com. |73 64 65 76 2E 63 6F 6D 00|;
var
X: System.Integer;
Y: System.Integer;
begin
00000000 : 55 PUSH EBP
00000001 : 8B EC MOV EBP,ESP
00000003 : 83 C4 F4 ADD ESP,-12
00000006 : 53 PUSH EBX
00000007 : 56 PUSH ESI
00000008 : 33 C0 XOR EAX,EAX
3、 使用 UltraEdit 打开vg_version.dcu 文件,输入查找串55 8B EC 83 C4 F4 53 56 33 C0,找到位置后,修改55 为C3 ,保存。
4、 重新对 VGScene 控件进行编译,提示框不见了,破解完成。
五、验证
从网上下载了 同是 KSDEV公司出品的 DXScene 源码版,打开dx_scene.pas 查看单元文件的初始化部分,代码如下:
initialization
{$IFDEF WIN32}
User32Lib := LoadLibrary(User32);
if User32Lib <> 0 then
begin
@SetLayeredWindowAttributes := GetProcAddress(User32Lib, 'SetLayeredWindowAttributes');
@UpdateLayeredWindow := GetProcAddress(User32Lib, 'UpdateLayeredWindow');
@PrintWindow := GetProcAddress(User32Lib, 'PrintWindow');
end;
{$ENDIF}
RegisterClasses([TdxBitmap, TdxPosition, TdxMeshData, TdxMaterial, TdxBitmapRect, TdxBounds]);
RegisterClasses([TdxScene, TdxObject, TdxCustomLayer, TdxCustomBufferLayer]);
RegisterClasses([TdxBitmapStream, TdxBitmapCollection, TdxBitmapList]);
RegisterDXObjects('Scene', [TdxCamera, TdxLight, TdxDummy, TdxProxyObject]);
RegisterDXObjects('Resources', [TdxBitmapObject]);
RegisterDXObjects('Shapes', [TdxBufferLayer]);
{$IFDEF DxSceneTrial}
ShowVersion2;
{$ENDIF}
{$IFDEF WIN32}
OleInitialize(nil);
{$ENDIF}
果然发现,试用版只是在发布时,使用 DxSceneTrial 编译参数对控件进行重新编译的,功能上并没有删减,说明上述破解方法可行
转载:http://blog.csdn.net/kim_fu/archive/2010/10/19/5951109.aspx