200分求破解,已经用dede找到关键的dcu,并且附上dumper结果,懂汇编和懂破解的大虾不要错过(200分)

  • 主题发起人 主题发起人 boyuanus
  • 开始时间 开始时间
B

boyuanus

Unregistered / Unconfirmed
GUEST, unregistred user!
unit SchedUtils;
{Source files:
SchedUtils.pas (5/30/2002 12:55:38 PM), Sched.inc (4/23/2002 9:18:42 AM)}

interface

uses
Classes {
T:TList, A:TList.Get},
SysInit,
System {
T:Integer, T:Double, T:TObject, A:TObject.Free, T:Boolean, T:String,
T:AnsiString, T:PAnsiChar, A:@HandleFinally};

procedure ClearObjectList (List: Classes.TList);

procedure FreeObjectList (List: Classes.TList);

function Min (a: System.Integer; b: System.Integer): System.Integer;

function Max (a: System.Integer; b: System.Integer): System.Integer;

function Sign (Value: System.Double): System.Integer;

procedure Finalization;

procedure SchedUtils;

implementation

uses
Dialogs {
A:MessageDlg, T:TMsgDlgType, A:mtWarning, T:TMsgDlgBtn, A:mbOK},
Windows {
T:HWND, A:FindWindow};

var
_DV_1: -$80000000..$7FFFFFFF;

procedure ClearObjectList (List: Classes.TList);
var
i: System.Integer;
begin
00000000 : // -- Line #66 --
00000000 : 53 PUSH EBX
00000001 : 56 PUSH ESI
00000002 : 57 PUSH EDI
00000003 : 8B F8 MOV EDI,EAX
00000000 : // -- Line #67 --
00000005 : 8B 5F 08 MOV EBX,DWORD PTR [EDI+8]
00000008 : 4B DEC EBX
00000009 : 85 DB TEST EBX,EBX
0000000B : 7C 15 JL +21; (0x22)
0000000D : 43 INC EBX
0000000E : 33 F6 XOR ESI,ESI
00000000 : // -- Line #68 --
00000010 : 8B D6 MOV EDX,ESI
00000012 : 8B C7 MOV EAX,EDI
00000014 : E8(00 00 00 00 CALL TList.Get{0x3}
00000019 : E8(00 00 00 00 CALL TObject.Free{0x9}
0000001E : 46 INC ESI
00000000 : // -- Line #67 --
0000001F : 4B DEC EBX
00000020 : 75 EE JNE -18; (0x10)
00000000 : // -- Line #69 --
00000022 : 8B C7 MOV EAX,EDI
00000024 : 8B 10 MOV EDX,DWORD PTR [EAX]
00000026 : FF 52 08 CALL DWORD PTR [EDX+8],NEAR
00000000 : // -- Line #70 --
00000029 : 5F POP EDI
0000002A : 5E POP ESI
0000002B : 5B POP EBX
0000002C : C3 RET NEAR
end;

procedure FreeObjectList (List: Classes.TList);
begin
00000000 : // -- Line #75 --
00000000 : 53 PUSH EBX
00000001 : 8B D8 MOV EBX,EAX
00000000 : // -- Line #76 --
00000003 : 8B C3 MOV EAX,EBX
00000005 : E8(00 00 00 00 CALL ClearObjectList{0x19}
00000000 : // -- Line #77 --
0000000A : 8B C3 MOV EAX,EBX
0000000C : E8(00 00 00 00 CALL TObject.Free{0x9}
00000000 : // -- Line #78 --
00000011 : 5B POP EBX
00000012 : C3 RET NEAR
end;

function Min (a: System.Integer; b: System.Integer): System.Integer;
var
Result: System.Integer;
begin
00000000 : // -- Line #84 --
00000000 : 3B D0 CMP EDX,EAX
00000002 : 7F 02 JG +2; (0x6)
00000000 : // -- Line #87 --
00000004 : 8B C2 MOV EAX,EDX
00000000 : // -- Line #88 --
00000006 : C3 RET NEAR
end;

function Max (a: System.Integer; b: System.Integer): System.Integer;
var
Result: System.Integer;
begin
00000000 : // -- Line #94 --
00000000 : 3B D0 CMP EDX,EAX
00000002 : 7C 02 JL +2; (0x6)
00000000 : // -- Line #97 --
00000004 : 8B C2 MOV EAX,EDX
00000000 : // -- Line #98 --
00000006 : C3 RET NEAR
end;

function Sign (Value: System.Double): System.Integer;
var
Result: System.Integer;
begin
00000000 : // -- Line #103 --
00000000 : 55 PUSH EBP
00000001 : 8B EC MOV EBP,ESP
00000000 : // -- Line #104 --
00000003 : DD 45 08 FLD QWORD PTR [EBP+8]
00000006 : D8 1D(34 00 00 00 FCOMP DWORD PTR [Sign{0x26}+$00000034]
0000000C : DF E0 FSTSW AX
0000000E : 9E SAHF
0000000F : 75 04 JNE +4; (0x15)
00000000 : // -- Line #105 --
00000011 : 33 C0 XOR EAX,EAX
00000013 : EB 18 JMP +24; (0x2D)
00000000 : // -- Line #107 --
00000015 : DD 45 08 FLD QWORD PTR [EBP+8]
00000018 : D8 1D(34 00 00 00 FCOMP DWORD PTR [Sign{0x26}+$00000034]
0000001E : DF E0 FSTSW AX
00000020 : 9E SAHF
00000021 : 73 05 JNB +5; (0x28)
00000000 : // -- Line #108 --
00000023 : 83 C8 FF OR EAX,-1
00000026 : EB 05 JMP +5; (0x2D)
00000000 : // -- Line #110 --
00000028 : B8 01 00 00 00 MOV EAX,$00000001
00000000 : // -- Line #111 --
0000002D : 5D POP EBP
0000002E : C2 08 00 RET NEAR,8
00000031 : 00 00 ADD BYTE PTR [EAX],AL
00000033 : 00 00 ADD BYTE PTR [EAX],AL
00000035 : 00 00 ADD BYTE PTR [EAX],AL
00000037 : 00 ?
end;

function DelphiRunning: System.Boolean;
var
Result: System.Boolean;
H1: Windows.HWND;
H2: Windows.HWND;
begin
00000000 : // -- Line #120 --
00000000 : 53 PUSH EBX
00000000 : // -- Line #121 --
00000001 : 6A 00 PUSH $00
00000003 : 68(2C 00 00 00 PUSH DelphiRunning{0x29}+$0000002C
00000008 : E8(00 00 00 00 CALL FindWindow{0x17}
0000000D : 8B D8 MOV EBX,EAX
00000000 : // -- Line #122 --
0000000F : 6A 00 PUSH $00
00000011 : 68(40 00 00 00 PUSH DelphiRunning{0x29}+$00000040
00000016 : E8(00 00 00 00 CALL FindWindow{0x17}
00000000 : // -- Line #123 --
0000001B : 85 DB TEST EBX,EBX
0000001D : 74 04 JE +4; (0x23)
0000001F : 85 C0 TEST EAX,EAX
00000021 : 75 04 JNE +4; (0x27)
00000023 : 33 C0 XOR EAX,EAX
00000025 : 5B POP EBX
00000026 : C3 RET NEAR
00000027 : B0 01 MOV AL,$01
00000000 : // -- Line #124 --
00000029 : 5B POP EBX
0000002A : C3 RET NEAR
0000002B : 00 54 50 72 ADD BYTE PTR [EAX+2*EDX+114],DL
0000002F : 6F OUTSW
00000030 : 70 65 JO +101; (0x97)
00000032 : 72 74 JB +116; (0xA8)
00000034 : 79 49 JNS +73; (0x7F)
00000036 : 6E OUTSB
00000037 : 73 70 JNB +112; (0xA9)
00000039 : 65 63 ARPL
0000003B : 74 6F JE +111; (0xAC)
0000003D : 72 00 JB 0; (0x3F)
0000003F : 00 54 41 70 ADD BYTE PTR [ECX+2*EAX+112],DL
00000043 : 70 42 JO +66; (0x87)
00000045 : 75 69 JNE +105; (0xB0)
00000047 : 6C INSB
00000048 : 64 65 72 00 JB 0; (0x4C)
end;

procedure CheckTrial;
const
sTrialWarning =
00:
 
自己提前
 
你想搞什么啊?破解控件?
 
没错,破解一个控件
 
delphi窑洞、www.playicq.com找不到吗?找不到再给我吧。
 
什么控件啊,没源码的控件要来作什么。
 
把jnz之类改成jz等,即可。因为你对该控件说明的不信息,我也不可能说清楚。
 
此控件是dream scheduler, 下载地址如下
http://www.dream-com.com/download.html#DreamSchedulerTrials
所附上的代码来自SchedUtils.dcu
请各大虾研究研究
 
控件破解指南
MikeDeakins
注意: 本文的转载必须获得作者同意( 作者电子邮件地址:
MikeDeakins@ChinaRen.com)。
不像可执行文件,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 文件有些区别,破解方法不在这里讨论。
(待续)
 
我的破解和你所需要的正好相同。
 
多谢mikedeakins,按照你的提示,已经搞定。
如果还有其他类似的难题,再向你请教!
 
mikedeakins,另有一请求,已经发到你的chinaren信箱中。请查收!
 
狗屎chinaren信箱,n长时间不能工作了。
请发到 mikedeakins*citiz.net (*换成@)。
 
ok. Have sent to mikedeakins@citiz.net
 
没收到。
 
后退
顶部