首页
社区
课程
招聘
[旧帖] 如何破解Delphi控件[求助] 0.00雪花
发表于: 2004-12-30 11:51 10343

[旧帖] 如何破解Delphi控件[求助] 0.00雪花

2004-12-30 11:51
10343
有没有这方面的资料,我很需要,知道的朋友请不吝赐教,小弟先谢谢了!
祝大家新年快乐!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这么长时间,怎么没有一个人知道呀!是不是我问的问题太幼稚了?
2005-1-4 10:00
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
1. 过节,大家都想好好happy一下.
2. 程序无名无姓,亦无你的分析过程,标题也不诱人,所以.....
3. 之前可以搜索一下之前的老文章,里面会有一些这类的内容.
4. 此论坛里有,baidu上也可以搜索到一些的.
5. 去delphi的大富翁论坛里,或许可以找到已经OK的呢.
2005-1-4 10:30
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的提醒!
2005-1-5 09:46
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我找到一些资料,贴出来大家共享!

来自:mikedeakins, 时间:2001-11-8 22:11:00, ID:717728
我来灌水。
******************************************************************************

控件破解指南
Mike Deakins
注意:本文的转载必须获得作者同意(作者电子邮件地址: [email]MikeDeakins@ChinaRen.com[/email])。
不像可执行文件,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 文件有些区别,破解方法不在这里
讨论。
(待续)

来自:悲酥清风, 时间:2001-11-8 19:21:00, ID:717209
不知道文章里面的CJ是不是DFW里的CJ:)
*****************************************************************************
标 题:SDL suite 5.5 (11千字)
发信人:1212
时 间:2001-4-2 16:11:21
详细信息:

SDL控件组也是不错的,可以做化学分子结构图;信号FFT分析;画科学工程图等等。
和ABAKUS一样,其源码难以得到,极其困难!!!
有谁有的话请发送到testdog@sina.com谢谢。

这次是SDL Suite 5.5。
表现症状:编译生成的程序也要在Delphi正在运行的情况下才会运行,不然的话会弹出对话框,
按OK后有两种表现,一种是直接退出;一种是运行程序但在它的控件上显示一串文字。
但是不管delphi是不是运行,程序运行时鼠标放在它的控件上都会有hint,
无论你在编程的时候有没有关掉showhint属性,它都要显示!
从CJ那儿下载回来的有一个crack,但是并没有破掉hint。

工具:Dede250,UltraEdit。
作者:renamed to jkl

这次所有的DCU文件都要用Dede250的DCU Dumper去Dumpe一下,不像Abakus201只在一个文件中。
步骤是一样的,以rchart.dcu为例。

1。把dumpe得到的文本文件用Ultraedit打开,凭感觉先查run,delphi,running啥的,哈哈,果然!

function DelphiIsRunning: System.Boolean;
var
  Result: System.Boolean;
  H0: WinProcs.HWND;
  H1: WinProcs.HWND;
  H2: WinProcs.HWND;
  H3: WinProcs.HWND;
  H4: WinProcs.HWND;
  H5: WinProcs.HWND;
  H6: WinProcs.HWND;
  H7: WinProcs.HWND;
  H8: WinProcs.HWND;
  H9: WinProcs.HWND;
const
  A1:array[$0..$C] of System.Char = raw[$0..$C]at $1AF0
    0: TApplication.[54 41 70 70 6C 69 63 61 74 69 6F 6E 00|K5 A1{0x1F6};
  A2:array[$0..$D] of System.Char = raw[$0..$D]at $1AFD
    0: TAlignPalette.[54 41 6C 69 67 6E 50 61 6C 65 74 74 65 00|K5 A2{0x1F7};
  A3:array[$0..$12] of System.Char = raw[$0..$12]at $1B0B
    00: TPropertyInspect[54 50 72 6F 70 65 72 74 79 49 6E 73 70 65 63 74|K5 A3{0x1F8}
    10: or.            |6F 72 00|;
  A4:array[$0..$B] of System.Char = raw[$0..$B]at $1B1E
    0: TAppBuilder.[54 41 70 70 42 75 69 6C 64 65 72 00|K5 A4{0x1F9};
  T0:array[$0..$A] of System.Char = raw[$0..$A]at $1B2A
    0: Delphi 2.0.[44 65 6C 70 68 69 20 32 2E 30 00|K5 T0{0x1FA};
  T1:array[$0..$6] of System.Char = raw[$0..$6]at $1B35
    0: Delphi.[44 65 6C 70 68 69 00|K5 T1{0x1FB};
  T2:array[$0..$8] of System.Char = raw[$0..$8]at $1B3C
    0: Delphi 3.[44 65 6C 70 68 69 20 33 00|K5 T2{0x1FC};
  T3:array[$0..$A] of System.Char = raw[$0..$A]at $1B45
    0: C++Builder.[43 2B 2B 42 75 69 6C 64 65 72 00|K5 T3{0x1FD};
  T4:array[$0..$8] of System.Char = raw[$0..$8]at $1B50
    0: Delphi 4.[44 65 6C 70 68 69 20 34 00|K5 T4{0x1FE};
  T5:array[$0..$C] of System.Char = raw[$0..$C]at $1B59
    0: C++Builder 4.[43 2B 2B 42 75 69 6C 64 65 72 20 34 00|K5 T5{0x1FF};
  T6:array[$0..$8] of System.Char = raw[$0..$8]at $1B66
    0: Delphi 5.[44 65 6C 70 68 69 20 35 00|K5 T6{0x200};
begin
  00000000 : 53                            PUSH EBX
  00000001 : 56                            PUSH ESI
  00000002 : 57                            PUSH EDI
  00000003 : 55                            PUSH EBP
  00000004 : 83 C4 EC                      ADD ESP,-20
  00000007 : 68(00 00 00 00                PUSH T0{0x1FA}
  0000000C : 68(00 00 00 00                PUSH A1{0x1F6}
  00000011 : E8(00 00 00 00                CALL FindWindow{0xA9}
  00000016 : 8B D8                        MOV EBX,EAX
  00000018 : 68(00 00 00 00                PUSH T1{0x1FB}
  0000001D : 68(00 00 00 00                PUSH A1{0x1F6}
  00000022 : E8(00 00 00 00                CALL FindWindow{0xA9}
  00000027 : 8B F0                        MOV ESI,EAX
  00000029 : 68(00 00 00 00                PUSH T2{0x1FC}
  0000002E : 68(00 00 00 00                PUSH A1{0x1F6}
  00000033 : E8(00 00 00 00                CALL FindWindow{0xA9}
  00000038 : 89 44 24 04                  MOV DWORD PTR [ESP+4],EAX
  0000003C : 68(00 00 00 00                PUSH T3{0x1FD}
  00000041 : 68(00 00 00 00                PUSH A1{0x1F6}
  00000046 : E8(00 00 00 00                CALL FindWindow{0xA9}
  0000004B : 89 04 24                      MOV DWORD PTR [ESP],EAX
  0000004E : 68(00 00 00 00                PUSH T4{0x1FE}
  00000053 : 68(00 00 00 00                PUSH A1{0x1F6}
  00000058 : E8(00 00 00 00                CALL FindWindow{0xA9}
  0000005D : 89 44 24 08                  MOV DWORD PTR [ESP+8],EAX
  00000061 : 68(00 00 00 00                PUSH T5{0x1FF}
  00000066 : 68(00 00 00 00                PUSH A1{0x1F6}
  0000006B : E8(00 00 00 00                CALL FindWindow{0xA9}
  00000070 : 89 44 24 0C                  MOV DWORD PTR [ESP+12],EAX
  00000074 : 68(00 00 00 00                PUSH T6{0x200}
  00000079 : 68(00 00 00 00                PUSH A1{0x1F6}
  0000007E : E8(00 00 00 00                CALL FindWindow{0xA9}
  00000083 : 89 44 24 10                  MOV DWORD PTR [ESP+16],EAX
  00000087 : 6A 00                        PUSH $00
  00000089 : 68(00 00 00 00                PUSH A2{0x1F7}
  0000008E : E8(00 00 00 00                CALL FindWindow{0xA9}
  00000093 : 8B F8                        MOV EDI,EAX
  00000095 : 6A 00                        PUSH $00
  00000097 : 68(00 00 00 00                PUSH A3{0x1F8}
  0000009C : E8(00 00 00 00                CALL FindWindow{0xA9}
  000000A1 : 8B E8                        MOV EBP,EAX
  000000A3 : 6A 00                        PUSH $00
  000000A5 : 68(00 00 00 00                PUSH A4{0x1F9}
  000000AA : E8(00 00 00 00                CALL FindWindow{0xA9}
  000000AF : 85 DB                        TEST EBX,EBX
  000000B1 : 75 26                        JNE +38; (0xD9)
  000000B3 : 85 F6                        TEST ESI,ESI
  000000B5 : 75 22                        JNE +34; (0xD9)
  000000B7 : 83 3C 24 00                  CMP DWORD PTR [ESP],0
  000000BB : 75 1C                        JNE +28; (0xD9)
  000000BD : 83 7C 24 04 00                CMP DWORD PTR [ESP+4],0
  000000C2 : 75 15                        JNE +21; (0xD9)
  000000C4 : 83 7C 24 08 00                CMP DWORD PTR [ESP+8],0
  000000C9 : 75 0E                        JNE +14; (0xD9)
  000000CB : 83 7C 24 0C 00                CMP DWORD PTR [ESP+12],0
  000000D0 : 75 07                        JNE +7; (0xD9)
  000000D2 : 83 7C 24 10 00                CMP DWORD PTR [ESP+16],0
  000000D7 : 74 0C                        JE +12; (0xE5)
  000000D9 : 85 FF                        TEST EDI,EDI
  000000DB : 74 08                        JE +8; (0xE5)
  000000DD : 85 ED                        TEST EBP,EBP
  000000DF : 74 04                        JE +4; (0xE5)
  000000E1 : 85 C0                        TEST EAX,EAX
  000000E3 : 75 04                        JNE +4; (0xE9)
  000000E5 : 33 C0                        XOR EAX,EAX
  000000E7 : EB 02                        JMP +2; (0xEB)
  000000E9 : B0 01                        MOV AL,$01
  000000EB : 83 C4 14                      ADD ESP,20
  000000EE : 5D                            POP EBP
  000000EF : 5F                            POP EDI
  000000F0 : 5E                            POP ESI
  000000F1 : 5B                            POP EBX
  000000F2 : C3                            RET NEAR
end;

上面调用findwindow在找delphi或bcb的不同版本呢。要是找到一个的话就 MOV AL,$01

这样继续查找DelphiIsRunning,看它在那里调用:

  00004377 : 8B 4D 10                      MOV ECX,DWORD PTR [EBP+16]
  0000437A : 8B 55 E8                      MOV EDX,DWORD PTR [EBP-24]
  0000437D : 8B 45 EC                      MOV EAX,DWORD PTR [EBP-20]
  00004380 : E8(00 00 00 00                CALL TCanvas.LineTo{0x6F}
  00004385 : E8(00 00 00 00                CALL DelphiIsRunning{0x201}
  0000438A : 84 C0                        TEST AL,AL
  0000438C : 0F 85 B1 00 00 00            JNE +177; (0x4443)
  00004392 : 8B 45 EC                      MOV EAX,DWORD PTR [EBP-20]
  00004395 : 8B 40 0C                      MOV EAX,DWORD PTR [EAX+12]
  00004398 : BA FF FF FF 00                MOV EDX,$00FFFFFF

调用    00004385 : E8(00 00 00 00                CALL DelphiIsRunning{0x201}
后有    test al,al
如果 al=1 的话,就表明delphi正在运行,那么我们就把这一句用 mov al,1代替好了(机器码B001)。

在DCU文件中这个call DelphiIsRunning是要由编译器来动态连接其地址的,所以没法nop掉这个调用。

在所有的dcu文件中用同样的方法查找并替换就可以了,当然 test al,al后的下一条语句有的DCU文件和这里的不同,
没关系,只改 test al,al。

2。还有一个问题,它的hint总是要出现,告诉人们您正在用的是SDL公司的未注册版本,整个世界都要为之改变呢。
改掉它!查找shareware,copyright,unregister之类的东西,查到与copyright有关的:

function getCopyRightStr: System.AnsiString;
var
  result Result: System.AnsiString;
  AuxStr: System.AnsiString;
  i: System.Integer;
begin
  00000000 : 55                            PUSH EBP
  00000001 : 8B EC                        MOV EBP,ESP
  00000003 : 6A 00                        PUSH $00
  00000005 : 6A 00                        PUSH $00
  00000007 : 53                            PUSH EBX
  00000008 : 56                            PUSH ESI
  00000009 : 57                            PUSH EDI
  0000000A : 8B F8                        MOV EDI,EAX
  0000000C : 33 C0                        XOR EAX,EAX
  0000000E : 55                            PUSH EBP
  0000000F : 68(72 00 00 00                PUSH getCopyRightStr{0x1F2}+$00000072
  00000014 : 64 FF 30                      PUSH DWORD PTR FS:[EAX]
  00000017 : 64 89 20                      MOV DWORD PTR FS:[EAX],ESP
  0000001A : 8D 45 FC                      LEA EAX,DWORD PTR [EBP-4]
  0000001D : E8(00 00 00 00                CALL @LStrClr{0xE2}
  00000022 : BE 87 FF FF FF                MOV ESI,$FFFFFF87
  00000027 : BB(78 00 00 00                MOV EBX,ShareW{0x1F1}+$00000078
  0000002C : 8D 45 F8                      LEA EAX,DWORD PTR [EBP-8]
  0000002F : 33 D2                        XOR EDX,EDX
  00000031 : 8A 13                        MOV DL,BYTE PTR [EBX]
  00000033 : 8A 92(00 00 00 00            MOV DL,BYTE PTR [EDXCTDecode{0x1EF}]
  00000039 : E8(00 00 00 00                CALL @LStrFromChar{0xE3}
  0000003E : 8B 55 F8                      MOV EDX,DWORD PTR [EBP-8]
  00000041 : 8D 45 FC                      LEA EAX,DWORD PTR [EBP-4]
  00000044 : E8(00 00 00 00                CALL @LStrCat{0xE4}----------这是在拼凑那个hint呢
  00000049 : 4B                            DEC EBX
  0000004A : 46                            INC ESI
  0000004B : 75 DF                        JNE -33; (0x2C)--------------在这里改!跳到call @LStrAsg{0xE5}后面的那句
  0000004D : 8B C7                        MOV EAX,EDI
  0000004F : 8B 55 FC                      MOV EDX,DWORD PTR [EBP-4]
  00000052 : E8(00 00 00 00                CALL @LStrAsg{0xE5}---------拼完了就显示,那么跳过它!
  00000057 : 33 C0                        XOR EAX,EAX
  00000059 : 5A                            POP EDX
  0000005A : 59                            POP ECX
  0000005B : 59                            POP ECX
  0000005C : 64 89 10                      MOV DWORD PTR FS:[EAX],EDX
  0000005F : 68(79 00 00 00                PUSH getCopyRightStr{0x1F2}+$00000079
  00000064 : 8D 45 F8                      LEA EAX,DWORD PTR [EBP-8]
  00000067 : BA 02 00 00 00                MOV EDX,$00000002
  0000006C : E8(00 00 00 00                CALL @LStrArrayClr{0xE6}
  00000071 : C3                            RET NEAR
  00000072 : E9(00 00 00 00                JMP @HandleFinally{0xE7}
  00000077 : EB EB                        JMP -21; (0x64)
  00000079 : 5F                            POP EDI
  0000007A : 5E                            POP ESI
  0000007B : 5B                            POP EBX
  0000007C : 59                            POP ECX
  0000007D : 59                            POP ECX
  0000007E : 5D                            POP EBP
  0000007F : C3                            RET NEAR
end;

数一数后知道 75 DF 改成 EB 0A
这样就没有hint了,如果您想要自己的hint,请用别的办法吧,可以做得到的。
2005-1-6 10:03
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
来自:悲酥清风, 时间:2001-11-8 19:20:00, ID:717202
这次切入正题
*****************************************************************************
标 题:一个delphi控件的破解 (12千字)
发信人:1212
时 间:2001-3-31 17:21:30
详细信息:

Abakus是一套Delphi的工控控件,很好的。可惜搞不到源码。
从下面这个地方可以下载到2.01版,没有源码。

URL:http://www.torry.net/vcl/indicat/packs/abkda.zip
大小: 1159615

表现症状:当你放一个控件到你的Form,会有一个information的对话框出现;当你编译好一个程序,
在delphi没有运行的情况下,会有一个Error的对话框出现。

破解工具:Dede250,Ultraedit。
作者:sxlz

1。分析:看看所有的DCU文件,有没有可疑的地方,发现一个_abinfo.dcu,好像有问题!先拿它试试,
如果不成的话,最看别的。
2。运行Dede.exe,选取DCU Dumper,把_abinfo.dcu给Dumpe一下。
3。发现:

uses
  _PrjInfo {
    A:pName, A:pVersion, A:Copyright, A:Mail, A:WWW},
  _AbProc {
    A:AbDelphiIsRunning},
  IniFiles,
  
里有AbDelphiIsRunning,哈哈,继续查AbDelphiIsRunning,又发现:
procedure TAbInfo.nagTimerEvent (Self: TAbInfo; sender: System.TObject);
begin
  00000000 : 55                            PUSH EBP
  00000001 : 8B EC                        MOV EBP,ESP
  00000003 : 6A 00                        PUSH $00
  00000005 : 6A 00                        PUSH $00
  00000007 : 53                            PUSH EBX
  00000008 : 8B D8                        MOV EBX,EAX
  0000000A : 33 C0                        XOR EAX,EAX
  0000000C : 55                            PUSH EBP
  0000000D : 68(50 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000150
  00000012 : 64 FF 30                      PUSH DWORD PTR FS:[EAX]
  00000015 : 64 89 20                      MOV DWORD PTR FS:[EAX],ESP
  00000018 : A1(00 00 00 00                MOV EAX,DWORD PTR [AbInfo{0x44}]
  0000001D : 8B 40 1C                      MOV EAX,DWORD PTR [EAX+28]
  00000020 : 33 D2                        XOR EDX,EDX
  00000022 : E8(00 00 00 00                CALL TTimer.SetEnabled{0x10}
  00000027 : A1(00 00 00 00                MOV EAX,DWORD PTR [pName{0x2}]
  0000002C : FF 30                        PUSH DWORD PTR [EAX]
  0000002E : 68(64 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000164
  00000033 : A1(00 00 00 00                MOV EAX,DWORD PTR [pVersion{0x3}]
  00000038 : FF 30                        PUSH DWORD PTR [EAX]
  0000003A : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  0000003F : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  00000044 : 68(7C 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$0000017C
  00000049 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  0000004E : 68(C4 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$000001C4
  00000053 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  00000058 : 68(0C 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$0000020C
  0000005D : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  00000062 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  00000067 : 68(40 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000240
  0000006C : A1(00 00 00 00                MOV EAX,DWORD PTR [Mail{0x5}]
  00000071 : FF 30                        PUSH DWORD PTR [EAX]
  00000073 : 68(54 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000254
  00000078 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  0000007D : A1(00 00 00 00                MOV EAX,DWORD PTR [WWW{0x6}]
  00000082 : FF 30                        PUSH DWORD PTR [EAX]
  00000084 : 68(68 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000268
  00000089 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  0000008E : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  00000093 : A1(00 00 00 00                MOV EAX,DWORD PTR [Copyright{0x4}]
  00000098 : FF 30                        PUSH DWORD PTR [EAX]
  0000009A : 8D 45 FC                      LEA EAX,DWORD PTR [EBP-4]
  0000009D : BA 15 00 00 00                MOV EDX,$00000015
  000000A2 : E8(00 00 00 00                CALL @LStrCatN{0x3B}
  000000A7 : 68(88 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000288
  000000AC : FF 73 04                      PUSH DWORD PTR [EBX+4]
  000000AF : 68(B4 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$000002B4
  000000B4 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  000000B9 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  000000BE : 68(40 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000240
  000000C3 : A1(00 00 00 00                MOV EAX,DWORD PTR [Mail{0x5}]
  000000C8 : FF 30                        PUSH DWORD PTR [EAX]
  000000CA : 68(54 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000254
  000000CF : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  000000D4 : A1(00 00 00 00                MOV EAX,DWORD PTR [WWW{0x6}]
  000000D9 : FF 30                        PUSH DWORD PTR [EAX]
  000000DB : 68(68 02 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000268
  000000E0 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  000000E5 : 68(70 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
  000000EA : A1(00 00 00 00                MOV EAX,DWORD PTR [Copyright{0x4}]
  000000EF : FF 30                        PUSH DWORD PTR [EAX]
  000000F1 : 8D 45 F8                      LEA EAX,DWORD PTR [EBP-8]
  000000F4 : BA 0E 00 00 00                MOV EDX,$0000000E
  000000F9 : E8(00 00 00 00                CALL @LStrCatN{0x3B}
  000000FE : E8(00 00 00 00                CALL AbDelphiIsRunning{0x8}  --------------------检查delphi有没有运行
  00000103 : 66 85 C0                      TEST AX,AX
  00000106 : 74 15                        JE +21; (0x11D)              --------------------跳过去的话可以看到有halt0,凭直觉就不好,那就不跳好了。
  00000108 : 6A 00                        PUSH $00
  0000010A : 66 8B 0D(C4 02 00 00          MOV CX,WORD PTR [TAbInfo.nagTimerEvent{0x4C}+$000002C4]
  00000111 : B2 02                        MOV DL,$02
  00000113 : 8B 45 FC                      MOV EAX,DWORD PTR [EBP-4]
  00000116 : E8(00 00 00 00                CALL MessageDlg{0x12}
  0000011B : EB 18                        JMP +24; (0x135)
  0000011D : 6A 00                        PUSH $00
  0000011F : 66 8B 0D(C4 02 00 00          MOV CX,WORD PTR [TAbInfo.nagTimerEvent{0x4C}+$000002C4]
  00000126 : B2 01                        MOV DL,$01
  00000128 : 8B 45 F8                      MOV EAX,DWORD PTR [EBP-8]
  0000012B : E8(00 00 00 00                CALL MessageDlg{0x12}
  00000130 : E8(00 00 00 00                CALL @Halt0{0x3A}
  00000135 : 33 C0                        XOR EAX,EAX
  00000137 : 5A                            POP EDX
  00000138 : 59                            POP ECX
  00000139 : 59                            POP ECX
  0000013A : 64 89 10                      MOV DWORD PTR FS:[EAX],EDX
  0000013D : 68(57 01 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}+$00000157
  00000142 : 8D 45 F8                      LEA EAX,DWORD PTR [EBP-8]
  00000145 : BA 02 00 00 00                MOV EDX,$00000002
  0000014A : E8(00 00 00 00                CALL @LStrArrayClr{0x3C}
  0000014F : C3                            RET NEAR
  00000150 : E9(00 00 00 00                JMP @HandleFinally{0x3D}
  00000155 : EB EB                        JMP -21; (0x142)
  00000157 : 5B                            POP EBX
  00000158 : 59                            POP ECX
  00000159 : 59                            POP ECX
  0000015A : 5D                            POP EBP
  0000015B : C3                            RET NEAR

这个可以消除information的对话框。

4。查前面有函数:

var
  AbInfo:TAbInfo;

const
  Reg:System.AnsiString = raw[$0..$3]at $157
    0: ....{08 00 00 00|K5 Reg{0x45}, K1 _NF_46;

function LoadAbakusInfo: TAbInfo;

那就找LoadAbakusInfo,发现:
function LoadAbakusInfo: TAbInfo;
begin
  00000000 : 53                            PUSH EBX
  00000001 : 56                            PUSH ESI
  00000002 : BB(00 00 00 00                MOV EBX,AbInfo{0x44}---------这一行带(的是动态地址
  00000007 : 83 3B 00                      CMP DWORD PTR [EBX],0--------这个改成1,跳过去就妥了!
  0000000A : 0F 85 B2 00 00 00            JNE +178; (0xC2)
  00000010 : B2 01                        MOV DL,$01
  00000012 : A1(00 00 00 00                MOV EAX,DWORD PTR [TAbInfo{0x42}]
  00000017 : E8(00 00 00 00                CALL TAbInfo.Create{0x49}
  0000001C : 89 03                        MOV DWORD PTR [EBX],EAX
  0000001E : 8B 03                        MOV EAX,DWORD PTR [EBX]
  00000020 : FF 40 18                      INC DWORD PTR [EAX+24]
  00000023 : 8B 0D(00 00 00 00            MOV ECX,DWORD PTR [Application{0x19}]
  00000029 : 8B 09                        MOV ECX,DWORD PTR [ECX]
  0000002B : B2 01                        MOV DL,$01
  0000002D : A1(00 00 00 00                MOV EAX,DWORD PTR [TTimer{0xC}]
  00000032 : E8(00 00 00 00                CALL TTimer.Create{0xD}
  00000037 : 8B F0                        MOV ESI,EAX
  00000039 : 8B 03                        MOV EAX,DWORD PTR [EBX]
  0000003B : 89 70 1C                      MOV DWORD PTR [EAX+28],ESI
  0000003E : 8B C6                        MOV EAX,ESI
  00000040 : BA F4 01 00 00                MOV EDX,$000001F4
  00000045 : E8(00 00 00 00                CALL TTimer.SetInterval{0xE}
  0000004A : 8B 03                        MOV EAX,DWORD PTR [EBX]
  0000004C : 50                            PUSH EAX
  0000004D : 68(00 00 00 00                PUSH TAbInfo.nagTimerEvent{0x4C}
  00000052 : 8B 03                        MOV EAX,DWORD PTR [EBX]
  00000054 : 8B 40 1C                      MOV EAX,DWORD PTR [EAX+28]
  00000057 : E8(00 00 00 00                CALL TTimer.SetOnTimer{0xF}
  0000005C : 8B 03                        MOV EAX,DWORD PTR [EBX]
  0000005E : 8B 40 1C                      MOV EAX,DWORD PTR [EAX+28]
  00000061 : B2 01                        MOV DL,$01
  00000063 : E8(00 00 00 00                CALL TTimer.SetEnabled{0x10}
  00000068 : 8B 03                        MOV EAX,DWORD PTR [EBX]
  0000006A : 83 C0 04                      ADD EAX,4
  0000006D : 8B 15(00 00 00 00            MOV EDX,DWORD PTR [pName{0x2}]
  00000073 : 8B 12                        MOV EDX,DWORD PTR [EDX]
  00000075 : E8(00 00 00 00                CALL @LStrAsg{0x35}
  0000007A : 8B 03                        MOV EAX,DWORD PTR [EBX]
  0000007C : 83 C0 08                      ADD EAX,8
  0000007F : 8B 15(00 00 00 00            MOV EDX,DWORD PTR [pVersion{0x3}]
  00000085 : 8B 12                        MOV EDX,DWORD PTR [EDX]
  00000087 : E8(00 00 00 00                CALL @LStrAsg{0x35}
  0000008C : 8B 03                        MOV EAX,DWORD PTR [EBX]
  0000008E : 83 C0 0C                      ADD EAX,12
  00000091 : 8B 15(00 00 00 00            MOV EDX,DWORD PTR [Copyright{0x4}]
  00000097 : 8B 12                        MOV EDX,DWORD PTR [EDX]
  00000099 : E8(00 00 00 00                CALL @LStrAsg{0x35}
  0000009E : 8B 03                        MOV EAX,DWORD PTR [EBX]
  000000A0 : 83 C0 10                      ADD EAX,16
  000000A3 : 8B 15(00 00 00 00            MOV EDX,DWORD PTR [Mail{0x5}]
  000000A9 : 8B 12                        MOV EDX,DWORD PTR [EDX]
  000000AB : E8(00 00 00 00                CALL @LStrAsg{0x35}
  000000B0 : 8B 03                        MOV EAX,DWORD PTR [EBX]
  000000B2 : 83 C0 14                      ADD EAX,20
  000000B5 : 8B 15(00 00 00 00            MOV EDX,DWORD PTR [WWW{0x6}]
  000000BB : 8B 12                        MOV EDX,DWORD PTR [EDX]
  000000BD : E8(00 00 00 00                CALL @LStrAsg{0x35}
  000000C2 : 8B 03                        MOV EAX,DWORD PTR [EBX]
  000000C4 : 5E                            POP ESI
  000000C5 : 5B                            POP EBX
  000000C6 : C3                            RET NEAR
end;

这个可以解决Error对话框的问题。

5。改完后,打开AbakusD5.dpk重新编译一下,重新安装。
6。要是有源码的话还是源码的好,谁有的话发给我testdog@sina.com非常感谢。
7。第一次写得不好,请原谅。
2005-1-6 10:05
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
来自:bluely, 时间:2001-11-8 18:38:00, ID:717087
搞破解汇编一定要熟这是基本条件,接下来就是技巧的问题了,我在破解控件经常是先把
有限制的控件放到一个测试程序里,然后编译成单独的可执行文件,单独跟踪这个文件,
找到关键点都把这个地方的汇编码记下,然后反编译控件相关的dcu文件,把关键的地方
改掉就ok了。另外,在Delphi的集成环境下也是可以跟踪的,只是麻烦点而已。
用到的工具和相关信息:
SoftIce或TRW2000:用来动态跟踪,我个人比较习惯用trw2000,用他脱壳也比较方便,不过他不能在winnt/win2k下
运行。
DeDe:静态反编译Delphi程序的,这东东简直就是Delphi程序员的恶梦。
w32dasm或IDA:静态反编译程序用的,简单分析用w32dasm,象复杂分析就用IDA吧。
FileMon和Regmon:文件监视器和注册表监视器,监视文件系统和注册表的丝毫改动。
  

来自:cjm, 时间:2001-11-8 18:56:00, ID:717127
JamShellBrowser
:mikedeakins, 时间:2001-6-11 11:10:57, ID:561930  
shellbrowser.dcu:
85 C0 74 10 6A 00 68 30 01 00 00 E8 00 00 00 00 85 C0 75 18 改为
90 90 90 90                                           EB

   0000009D : 76 EA                         JBE -22; (0x89)
   0000009F : 6A 00                         PUSH $00
   000000A1 : 68(20 01 00 00                PUSH ShellBrowser{0x37F}+$00000120
   000000A6 : E8(00 00 00 00                CALL FindWindow{0x138}

   000000AB : 85 C0                         TEST EAX,EAX
   000000AD : 74 10                         JE +16; (0xBF)
   000000AF : 6A 00                         PUSH $00
   000000B1 : 68(30 01 00 00                PUSH ShellBrowser{0x37F}+$00000130
   000000B6 : E8(00 00 00 00                CALL FindWindow{0x138}
   000000BB : 85 C0                         TEST EAX,EAX
   000000BD : 75 18                         JNE +24; (0xD7)

   000000BF : 6A 30                         PUSH $30
   000000C1 : B9(44 01 00 00                MOV ECX,ShellBrowser{0x37F}+$00000144
   000000C6 : BA(54 01 00 00                MOV EDX,ShellBrowser{0x37F}+$00000154
   000000CB : A1(00 00 00 00                MOV EAX,DWORD PTR [Application{0xB5}]
   000000D0 : 8B 00                         MOV EAX,DWORD PTR [EAX]
   000000D2 : E8(00 00 00 00                CALL TApplication.MessageBox{0xBB}
   000000D7 : 33 C0                         XOR EAX,EAX
   000000D9 : 5A                            POP EDX
   000000DA : 59                            POP ECX
   000000DB : 59                            POP ECX
   000000DC : 64 89 10                      MOV DWORD PTR FS:[EAX],EDX
   000000DF : 68(EC 00 00 00                PUSH ShellBrowser{0x37F}+$000000EC

这就是带有限制的源代码。还是那个原理,要想判断是不是在 delphi 内,必须使用
FindWindow,这个程序更简单:它显示了消息对话框,你只要用 dede 反汇编,然后
搜索 MessageBox 就可以马上定位到这里,又有 FindWindow,确定无疑。第一部分修
改,原来的意思是跳转到显示对话框的代码,我们不让他跳转,改为 NOP 指令(90)
第二部分是非零跳转到正常执行。好了,我们使用 JMP,让他总是跳转到正常执行。
  

来自:ilovedelphi3, 时间:2001-11-8 19:00:00, ID:717139
如果这个控件只是判断DELPHI IDE是否运行该怎么办呢?  

来自:Adnil, 时间:2001-11-8 19:08:00, ID:717155
判断IDE运行的程序一般查找IDE窗口的类名是否存在,修改DCU文件把这些类名为自己的类名就行了,例如TForm1,不过还有一个问题,类名在这些加密控件中也被加密了,用二进制查找也不能找到,还是要用softice这类跟踪程序才能破解。  

来自:悲酥清风, 时间:2001-11-8 19:17:00, ID:717192
这个虽然不是破解,但跟破解也差不多了。
*************************************************************************
标 题:Delphi控件EasyTable的去除NagScreen (4千字)
发信人:henryw
时 间:2001-3-16 6:51:36
详细信息:

Delphi控件EasyTable的去除NagScreen

[控件介绍]
    BDE作为数据库引擎似乎太笨重了一些,所以现在出了很多替代它的工具,EasyTable是其中的一个。
    它有自己的特点,比如数据库可以压缩,可以数据加密,当然,功能还是不够完善,但是对于小程
序来说已经足够用了。

    下载地址:
http://www.aidaim.com/cgi-bin/download.cgi?url=http://www.aidaim.com/download/tetfred5.zip

[使用工具]
Win32Dasm
DCUExplorer
DeDe
HEdit

[过程介绍]
    首先安装好这个控件,然后打开自带的Demo进行编译。在Delphi运行时候启动Demo,没有Nagscreen。
关闭Delphi,运行Demo,NagScreen出来了。

    Win32Dasm上场,反编译后查找NagScreen里面显示的字串:This is....,没有!Easy Table Free,
还是没有!这下有些麻烦了。使用DeDe反编译,发现有TAboutBox项,好吧,就从这里入手。

    先在控件安装目录下查找字串:"Easy Table Free"和"This is blah blah blah",在两个DCU文件中
找到:AboutBox.dcu、EasyTable.dcu。显然,对于程序而言,EasyTable里面会调用AboutBox,所以注意
力集中在EasyTable里面。使用DCUExplorer对EasyTable.dcu进行反汇编,查找第一个AboutScreen,所见
如下:

{ 19F: u?    |75 BA              | }
        JNE  @@015B; (0x15B) { OpCode : 03 }
{ 1A1: ??  |80 7D F7 00        | }
@@01A1 : CMP  BYTE PTR [EBP-9],$00 { OpCode : 38 }
{ 1A5: u~    |75 7E              | }
        JNE  @@0225; (0x225) { OpCode : 03 }
{ 1A7: ?.... |8B 0D(00 00 00 00  | }
        MOV  ECX,DWORD PTR [AboutScreen {0x4}] { OpCode : 87 }
{ 1AD: ?...  |A1(00 00 00 00      | }
        MOV  EAX,DWORD PTR [Application {0x62}] { OpCode : 87 }

有些过分乱了。虽然我看不太明白,不过可以试试看,假设AboutScreen是那个Nagscreen,那么看看编译后
的Demo第一次是如何调用AboutScreen的呢?好了,使用Hex编辑器查找Demo主程序里的
75 BA 80 7D F7 00 75 7E 8B 0D,只能找到一处,看来不错。

然后记下此处的offset,到Win32Dasm反编译出来的文件中去找,会看见如下代码:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049D2C7(C)
|
:0049D2CF 46                      inc esi
:0049D2D0 FF4DF0                  dec [ebp-10]
:0049D2D3 75BA                    jne 0049D28F  <---------------

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0049D287(C), :0049D2CD(U)
|
:0049D2D5 807DF700                cmp byte ptr [ebp-09], 00  <-----------------
:0049D2D9 757E                    jne 0049D359    <---------------
:0049D2DB 8B0DC0224B00            mov ecx, dword ptr [004B22C0]
:0049D2E1 A1B0214B00              mov eax, dword ptr [004B21B0]
:0049D2E6 8B00                    mov eax, dword ptr [eax]

往上看,代码如下:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049D2D3(C)
|
:0049D28F 8D4DEC                  lea ecx, dword ptr [ebp-14]
:0049D292 8BD6                    mov edx, esi
:0049D294 8B45F8                  mov eax, dword ptr [ebp-08]
:0049D297 8B38                    mov edi, dword ptr [eax]
:0049D299 FF570C                  call [edi+0C]
:0049D29C 8B55EC                  mov edx, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Delphi"
                                  |
:0049D29F B8ECD34900              mov eax, 0049D3EC
:0049D2A4 E8A36EF6FF              call 0040414C
:0049D2A9 48                      dec eax        <----------------  @@
:0049D2AA 741D                    je 0049D2C9    <----------------  @@
:0049D2AC 8D4DE8                  lea ecx, dword ptr [ebp-18]  <--  @@
:0049D2AF 8BD6                    mov edx, esi
:0049D2B1 8B45F8                  mov eax, dword ptr [ebp-08]
:0049D2B4 8B38                    mov edi, dword ptr [eax]
:0049D2B6 FF570C                  call [edi+0C]
:0049D2B9 8B55E8                  mov edx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"C++Builder"
                                  |
:0049D2BC B8FCD34900              mov eax, 0049D3FC
:0049D2C1 E8866EF6FF              call 0040414C
:0049D2C6 48                      dec eax
:0049D2C7 7506                    jne 0049D2CF

到了这里就有些明白了,它似乎在寻找Delphi或者C++Builder是否已经启动,没有的话就跳
对话框。在Dasm里面load Demo程序,断点设在0049D2AA处,发现此处不跳转。

试着在0049D2AA处改为jmp 0049D2C9,再运行程序,没有NagScreen了。

最后一步,将EasyTable.dcu和tet_pack.bpl(安装控件的时候自己将新建包命名为tet_pack.dpk)
用Hex编辑器打开,找@@处的机器码,然后将741D改为EB1D。重新运行Delphi,编译Demo程序,
关闭Delphi,运行Demo程序,没有了NagScreen。为了保险起见,由于我的硬盘是两个C盘,在
另外一个干净的Win98中试用,结果还是没有NagScreen出现,看来可以收工了。

--------------------------------------------------------------------------------  

来自:悲酥清风, 时间:2001-11-8 19:18:00, ID:717197
这是个简单的破解。
***************************************************************************
标 题:初学者的东西:BUPack Package控件注册提示窗口消除 (1千字)
发信人:Passion
时 间:2000-12-26 21:02:58
详细信息:

BUPack Package控件注册提示窗口消除法。

BUYPIN系列套装控件BUPack Package是Delphi下的需要莫名其妙地注册的优秀控件组之一,凡是使用了它的程序在运行时都会检测是否是设计期还是运行期,方法就是通过FindWindowA函数查找Delphi中的对象观察器窗口的类名"TPropertyInspector",根据返回的值判断是否存在此窗口,进而判断是否处于设计环境下。如果不是,则弹出提示注册对话框。

程序中对应的代码如下:

:00473004 6A00                    push 00000000
:00473006 6818304700              push 00473018

        ;这里00473018处是字符串"TPropertyInspector"的地址。

:0047300B E85C36F9FF              Call 0040666C

     ;调用Findwindow函数。
     
:00473010 85C0                    test eax, eax
:00473012 0F95C0                  setne al

     ;如果EAX为0则将AL设置为0。如EAX非0则表示找到了"TPropertyInspector"窗口,
     接下来的SETNE AL会使AL变为1,表示处于设计期,不出现注册提示框。
     
:00473015 C3                      ret

因此好办,将setne al改成mov al,1就是了。不过后边还得加一个NOP

总结:
查找并修改以下十六进制字符串便可消除提示框:
85 C0 0F 95 C0 C3
-->
.. .. B0 01 90 ..

――当然,解除BUPack Package控件提示框的方法还有很多,但这个算比较保险的,只需要修改一条指令,而且似乎还比较通用,不像其他修改特定地址的CALL指令或JNZ指令的方法,倘若换一个程序,没准就失效了。
2005-1-6 10:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
问题太幼稚了
2005-1-8 10:29
0
游客
登录 | 注册 方可回帖
返回
//