160 个 CrackMe 之 041 -- defiler.1 的菜单Patch过程及分析
本帖最后由 solly 于 2019-6-19 17:18 编辑160 个 CrackMe 之 041 - defiler.1 是一个 Delphi 编制的 CrackMe,论坛中至少已有3贴説明了,pk8900也有收集,我这里再说明一下,主要是觉得:
1、原有几种方式操作有些复杂;
2、没有充分利用 Delphi 的特性;
3、修改程序的代码量有点多。
既然是 Delphi 程序,当然先用 DeDeDark 打开看看吧:
按 rules.txt 的要求,要做一个 Exit 菜单项的事件处理。但在 DeDeDark中可以看到,“窗体”代码中,Exit 菜单项没有 OnClick 事件属性,再看看过程:
可以看到,事件过程也只有一个:About2Click,这个就是 About 的事件处理过程,因此,可以断定,CrackMe 中没的 Exit 菜单的对应事件处理过程。
我们先看看 About2Click() 事件的代码,双击上图的事件名即可打开代码查看器,如下图:
可以看到 About2Click() 函数的代码,具体内容如下:0043E270 6A40 push $40
* Possible String Reference to: 'bleh'
|
0043E272 B98CE24300 mov ecx, $0043E28C
* Possible String Reference to: 'See rules.txt, mail your solution t
| o defiler@immortaldescendants.org'
|
0043E277 BA94E24300 mov edx, $0043E294
0043E27C A1D0FB4300 mov eax, dword ptr [$0043FBD0]
0043E281 8B00 mov eax,
* Reference to: forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
|
0043E283 E88CE9FFFF call 0043CC14
0043E288 C3 ret
在 OD 中也可以看到这段代码及其资源:
0043E270 .6A 40 push 40
0043E272 .B9 8CE24300 mov ecx, 0043E28C ;ASCII "bleh"
0043E277 .BA 94E24300 mov edx, 0043E294 ;ASCII "See rules.txt, mail your solution to defiler@immortaldescendants.org"
0043E27C .A1 D0FB4300 mov eax, dword ptr
0043E281 .8B00 mov eax, dword ptr
0043E283 .E8 8CE9FFFF call 0043CC14 ;call forms.TApplication.MessageBox()
0043E288 .C3 retn
0043E289 00 db 00
0043E28A 00 db 00
0043E28B 00 db 00
0043E28C .62 6C 65 68 0>ascii "bleh",0
0043E291 00 db 00
0043E292 00 db 00
0043E293 00 db 00
0043E294 .53 65 65 20 7>ascii "See rules.txt, m"
0043E2A4 .61 69 6C 20 7>ascii "ail your solutio"
0043E2B4 .6E 20 74 6F 2>ascii "n to defiler@imm"
0043E2C4 .6F 72 74 61 6>ascii "ortaldescendants"
0043E2D4 .2E 6F 72 67 0>ascii ".org",0
0043E2D9 00 db 00
0043E2DA 00 db 00
编过 Delphi 程序的人应该知道,Delphi 的事件是可以重用的,也就是説 Exit 菜单也可以使用这个事件处理过程,我们使用另一个工具来完成这个修改:eXeScope。我们用 eXeScope 打开 CrackMe 来修改 Delphi 程序的 RCData 资源,如下图:
在左侧的资源树中,选中“TFORM1”,然后在右侧的编辑区,在 Exit1 菜单对象中,增加一行 OnClick = About2Click,如下:
object MainMenu1: TMainMenu
Left = 120
Top = 80
object About1: TMenuItem
Caption = '&Ficken'
object About2: TMenuItem
Caption = '&About'
OnClick = About2Click
end
object Exit1: TMenuItem
Caption = '&Exit'
OnClick = About2Click
end
end
end
可以从上面的About2 菜单项中复制,改好后保存,如下图所示:
先择“OK”就可以了。
这样修改后,点 Exit 菜单,也会执行 About2Click() 函数,这样,我们只要修改 0x0043E270 处的 About2Click()就可以了。
用 OD 载入修改了资源的 CrackMe 程序,按 Ctrl+G,输入 0043E270,如下图所示:
我们来到了 Exit 和 About 的事件处理过程:
先在函数中的 0x0043E27C 处,下一个断点,如上图所示,再按 F9 运行 CrackMe,然后我们点击一个菜单项(About 或 Exit 均可),就会来到上面的断点。然后几个 F8 后,来到下图所示位置:
这里就是菜单处理事件回调处,如果处为0,则表示没有指定 OnClick 事件,不用回调用户代码。如果不为0,则在 0x0042F428 处的 call 指令回调用户编写的代码。
再按多次 F8 返回到下图代码范围,往上翻,就可以看到Windows消息处理的代码,其中中保存的是消息代码,我们需要处理两个消息:WM_COMMAND 和 WM_CLOSE。我们在 0x00420285 处下一个条件断点,如下图所示:
为什么要拦截 WM_CLOSE 消息呢,因为我们要先找到 WM_CLOSE消息的处理过程,然后才能改造 Exit 菜单的代码,用来退出 CrackMe。
经过几个来回的分析,我们确定,下图处就是 WM_COMMAND 和 WM_CLOSE 消息处理的分发处,从这里开始,进入不同的事件处理过程(jmp ecx):
上图ecx == 0x00438B68,是菜单事件处理,以及下图:
这里 ecx == 0x00438CEC,这是点击窗口右上角的关闭图标(即 WM_CLOSE)时的处理过程。
也就是 WM_COMMAND 和 WM_CLOSE 消息处理的分发,是通过一个 jmp ecx 跳转到不同的事件处理来完成的,具体代码如下:
00402E64 .53 push ebx
00402E65 .66:8B1A mov bx, word ptr
00402E68 .66:09DB or bx, bx
00402E6B .74 17 je short 00402E84
00402E6D .66:81FB 00C0cmp bx, 0C000
00402E72 .73 10 jnb short 00402E84
00402E74 .50 push eax
00402E75 .8B00 mov eax, dword ptr
00402E77 .E8 74FFFFFF call 00402DF0
00402E7C .58 pop eax
00402E7D .74 05 je short 00402E84
00402E7F .89D9 mov ecx, ebx
00402E81 .5B pop ebx
00402E82 .FFE1 jmp ecx ;跳转到不同的事件处理过程
00402E84 >5B pop ebx
00402E85 .8B08 mov ecx, dword ptr
00402E87 .FF61 F0 jmp dword ptr
00402E8A .C3 retn
其中,处理 WM_CLOSE 的事件处理代码如下:
00438CEC .E8 DF0B0000 call 004398D0
00438CF1 .C3 retn
这里看不出什么,我们用 IDA 打开 CrackMe ,通过地址找到上面代码,如下:
CODE:00438CEC sub_438CEC proc near ; DATA XREF: CODE:00432EBE↑o
CODE:00438CEC call @Forms@TCustomForm@Close$qqrv ; Forms::TCustomForm::Close(void)
CODE:00438CF1 retn
CODE:00438CF1 sub_438CEC endp
IDA中指明了我们调用的函数名是 Forms::TCustomForm::Close,这个就是关闭表单的过程,我们在后面要修改 Exit 菜单的事件代码,调用这里的代码退出 CrackMe。
另外,按 Delphi 事件处理过程的规则,每次调用事件时,至少都会传入一个 Sender 参数,所以我们手动调用 Form.Close()时,也要传入 Form 对象指针,这个指针 Delphi 会存于 ebx 中,所以我们可以根据 ebx 的值来区分是哪个组件在调用事件处理过程。通过几次观察,可以得到
;============= Sender ===============
Menu.Exit===> EBX = 021D357C
Menu.About ===> EBX = 021D344C
Form.Close ===> EBX = 021D1738
上面就是每次调用时传入的 Sender 参数并会存于 ebx 中,并且 ebx 的高 16 bits 是变化的,而低 16 bits 不变,我们只要判断低 16 bits (即bx)就可以了。
下面,我们开始构建一个新的事件过程,用于处理菜单消息,我们来到前面找到的About 事件处理过程(0x0043E270处),往下拖动滚动条,寻找用来填充代码的空白区域,到 0x0043E4C0 处,可以找到一大片空白区域,我们在这里填充我们的事件处理代码和数据,如下图所示:
上图已输入了所需代码(上图的第2行的je指令还没修正偏移量,下图是修正了的),正在填充字符串数据,数据填充完后:
具体代码如下:
;======================================================================================
0043E4C0 66:81FB 7C35 cmp bx, 357C ;Sender 是否为 Exit 菜单项
0043E4C5 74 1B je short 0043E4E2 ;是则跳转去执行 Exit 操作
0043E4C7 90 nop ;下面是原有 About 事件处理代码
0043E4C8 6A 40 push 40 ;MB_OK | MB_ICONINFORMATION
0043E4CA B9 8CE24300 mov ecx, 0043E28C ;ASCII "bleh"
0043E4CF BA 94E24300 mov edx, 0043E294 ;ASCII "See rules.txt, mail your solution to defiler@immortaldescendants.org"
0043E4D4 A1 D0FB4300 mov eax, dword ptr
0043E4D9 8B00 mov eax, dword ptr
0043E4DB E8 34E7FFFF call 0043CC14 ;call forms.TApplication.MessageBox()
0043E4E0 C3 retn ;eax == IDOK == 1
0043E4E1 90 nop ;下面是新加的 Exit 事件处理代码
0043E4E2 6A 44 push 44 ;MB_YESNO | MB_ICONINFORMATION
0043E4E4 B9 8CE24300 mov ecx, 0043E28C ;ASCII "bleh"
0043E4E9 BA 10E54300 mov edx, 0043E510 ;ASCII "Do you fickbirne really want to quit?"
0043E4EE A1 D0FB4300 mov eax, dword ptr
0043E4F3 8B00 mov eax, dword ptr
0043E4F5 E8 1AE7FFFF call 0043CC14 ;call forms.TApplication.MessageBox()
0043E4FA 83F8 06 cmp eax, 6 ;IDOK= 1, IDYES = 6, IDNO = 7 (这里为6表示选择了“YES”)
0043E4FD /75 0C jnz short 0043E50B ;不为IDYES则跳转并返回,否则调用 CustomForm.Close(Sender)退出程序
0043E4FF |8BC3 mov eax, ebx ;eax为Sender参数,从ebx取得 Sender 对象高16位
0043E501 |66:B8 3817 mov ax, 1738 ;修改Sender对象的低 16 位,修改成 CustomForm 对象。
0043E505 ^|E9 E2A7FFFF jmp 00438CEC ;调用 CustomForm.Close(Sender)
0043E50A |90 nop
0043E50B \C3 retn ;如果选择“NO”,则 eax == IDNO,在这里返回
数据如下:
;---------------------------------------------------------------------------------------
0043E51044 6F 20 79 6F 75 20 66 69 63 6B 62 69 72 6E 65Do you fickbirne
0043E52020 72 65 61 6C 6C 79 20 77 61 6E 74 20 74 6F 20 really want to
0043E53071 75 69 74 3F 00 00 00 00 00 00 00 00 00 00 00quit?...........
以上事件处理过程和数据录入完成后,就修改(0043E270)处的原事件代码,指向新的事件处理代码:
具体代码改动后,如下所示:
;=======================================================================================
0043E270 /E9 4B020000 jmp 0043E4C0 ;直接跳转到新的事件处理代码
0043E275 |90 nop
0043E276 |90 nop
0043E277 . |BA 94E24300 mov edx, 0043E294 ;ASCII "See rules.txt, mail your solution to defiler@immortaldescendants.org"
0043E27C . |A1 D0FB4300 mov eax, dword ptr
0043E281 . |8B00 mov eax, dword ptr
0043E283 . |E8 8CE9FFFF call 0043CC14
0043E288 . |C3 retn
搞完这些操作后,需要把这些变动保存起来,先把我们设置的所有断点禁用。
在改动了的代码上按右键,如下:
选择“复制到可执行文件==>所有修改”。会有一个确认提示:
选择“复制”,一共进行3次确认后,如下图:
再点右键,如下图:
选择”保存文件“,然后输入一个新的文件名保存即可。
我们运行刚才保存的新文件程序,击”Exit“菜单项,可以看到下面的提示:
按”是“就退出 CrackMe, 按”否“则不会退出。
下面是直接修改文件(eXeScope修改后的文件)时的地方,新事件和资源:
;==== File =======
0003d8c0h: 66 81 FB 7C 35 74 1B 90 6A 40 B9 8C E2 43 00 BA ; f侞|5t.恓@箤釩.?
0003d8d0h: 94 E2 43 00 A1 D0 FB 43 00 8B 00 E8 34 E7 FF FF ; 斺C.⌒鸆.????
0003d8e0h: C3 90 6A 44 B9 8C E2 43 00 BA 10 E5 43 00 A1 D0 ; 脨jD箤釩.?錍.⌒
0003d8f0h: FB 43 00 8B 00 E8 1A E7 FF FF 83 F8 06 75 0C 8B ; 鸆.????凐.u.?
0003d900h: C3 66 B8 38 17 E9 E2 A7 FF FF 90 C3 00 00 00 00 ; 胒?.殁??惷....
0003d910h: 44 6F 20 79 6F 75 20 66 69 63 6B 62 69 72 6E 65 ; Do you fickbirne
0003d920h: 20 72 65 61 6C 6C 79 20 77 61 6E 74 20 74 6F 20 ;really want to
0003d930h: 71 75 69 74 3F 00 00 00 00 00 00 00 00 00 00 00 ; quit?...........
原事件处理代码的修改:
;----------------------------------------------------------------------------
0003d670h: E9 4B 02 00 00 90 90 BA 94 E2 43 00 A1 D0 FB 43 ; 镵...悙簲釩.⌒鸆
分析完毕!!!
160 个 CrackMe 之 046 douby.exe 也是一个菜单 CrackMe。
其有三个菜单有 NAG 弹出,Crackme 非常简单,只要修一个 switch 跳转表即可:
原始跳转表:
00401260 . \FA114000 dd douby.004011FA ;Load; 分支表 被用于 004011F3
00401264 .37124000 dd douby.00401237
00401268 .FA114000 dd douby.004011FA ;Exit
0040126C .15124000 dd douby.00401215 ;About
00401270 .FA114000 dd douby.004011FA ;Save
改成新的跳转表:
00401260 . \37124000 dd douby.00401237 ;Load
00401264 .37124000 dd douby.00401237 ;分支表 (1-based) 被用于 004011F3
00401268 .59114000 dd douby.00401159 ;Exit
0040126C .15124000 dd douby.00401215 ;About
00401270 37124000 dd douby.00401237 ;Save
就可以去除 NAG,并且 Exit 菜单可以退出 Crackme。
160 CrackMe 之 095 -- JuNkLe.1 BUG 修复
本帖最后由 solly 于 2019-6-18 21:18 编辑160 CrackMe 之 095 -- JuNkLe.1 是一个纯 DOS 的 Crackme,是由 Turbo Pascal 编写的。但是存在一个BUG,在高于 PII 233 的机器上运行会出错。
下是针对该Bug 进行修复:
:0001.0153 B8E4FF mov ax, FFE4
:0001.0156 99 cwd
:0001.0157 E83C02 call 0396
:0001.015A F7D0 not ax
:0001.015C F7D2 not dx
:0001.015E B93700 mov cx, 0037
:0001.0161 F7F1 div cx ; 这里会溢出
:0001.0163 A36200 mov word ptr , ax
上面代码中的 div cx 会导致溢出,mov cx, 0x0037 中给cx赋值太小了,改大就可了,如改成 mov cx, 0x3700,就可以正常运行了,改动如下:
:0001.0153 B8E4FF mov ax, FFE4
:0001.0156 99 cwd
:0001.0157 E83C02 call 0396
:0001.015A F7D0 not ax
:0001.015C F7D2 not dx
:0001.015E B93700 mov cx, 3700 ; cx 放大了 0x100 倍。
:0001.0161 F7F1 div cx
:0001.0163 A36200 mov word ptr , ax
将cx放大0x100倍后就运行正常:
{:301_999:}{:301_999:}{:301_999:}{:301_999:}{:301_999:}{:301_999:}123123 本帖最后由 solly 于 2019-6-25 18:02 编辑
160 CrackMe 之 150 -- tc.18 是一个 Delphi 编译的 CrackMe,这个 CrackMe 是要求去除 NAG,经 DeDe 查看,其 NAG 就是 TForm1,主界面是 TForm2。
根据 Delphi 主表单的规则,第一个创建的 TForm表单即主表单,并且会显示主表单,后面创建的表单是不显示的,CrackMe中是在 TForm1 的 OnShow 事件 nag 中显示的 TForm2。所以,只要修改 TApplication.CreateForm()的参数即可只显示TForm2,而即使创建了 TForm1,也不会显示出来。
下面是 CrackMe 的 start(),就是在这个函数创建的两个 TForm,我们将两个表单的创建顺序对调一下,就可以去除 Nag 的显示了。IDA 中的汇编代码:CODE:004451A8 public start
CODE:004451A8 start proc near
CODE:004451A8 push ebp
CODE:004451A9 mov ebp, esp
CODE:004451AB add esp, 0FFFFFFF4h
CODE:004451AE mov eax, offset dword_445068
CODE:004451B3 call @Sysinit@@InitExe$qqrv ; Sysinit::__linkproc__ InitExe(void)
CODE:004451B8 mov eax, ds:off_446CDC
CODE:004451BD mov eax,
CODE:004451BF call sub_43E564
CODE:004451C4 mov ecx, ds:off_446DB0
CODE:004451CA mov eax, ds:off_446CDC
CODE:004451CF mov eax,
CODE:004451D1 mov edx, off_444E70 ; == TForm1 的资源地址
CODE:004451D7 call @TApplication@CreateForm$qqrp10TMetaClasspv ; TApplication::CreateForm(TMetaClass *,void *)
CODE:004451DC mov ecx, ds:off_446DD4
CODE:004451E2 mov eax, ds:off_446CDC
CODE:004451E7 mov eax,
CODE:004451E9 mov edx, off_444B8C ; == TForm2 的资源地址
CODE:004451EF call @TApplication@CreateForm$qqrp10TMetaClasspv ; TApplication::CreateForm(TMetaClass *,void *)
CODE:004451F4 mov eax, ds:off_446CDC
CODE:004451F9 mov eax, ; this
CODE:004451FB call @Forms@TApplication@Run$qqrv ; Forms::TApplication::Run(void)
CODE:00445200 call @System@@Halt0$qqrv ; System::__linkproc__ Halt0(void)
CODE:00445200 start endp
改变 TApplication.CreateForm() 的 EDX 参数,对调一下:
CODE:004451A8 public start
CODE:004451A8 start proc near
CODE:004451A8 push ebp
CODE:004451A9 mov ebp, esp
CODE:004451AB add esp, 0FFFFFFF4h
CODE:004451AE mov eax, offset dword_445068
CODE:004451B3 call @Sysinit@@InitExe$qqrv ; Sysinit::__linkproc__ InitExe(void)
CODE:004451B8 mov eax, ds:off_446CDC
CODE:004451BD mov eax,
CODE:004451BF call sub_43E564
CODE:004451C4 mov ecx, ds:off_446DB0
CODE:004451CA mov eax, ds:off_446CDC
CODE:004451CF mov eax,
CODE:004451D1 mov edx, off_444B8C ; == TForm2 的资源地址
CODE:004451D7 call @TApplication@CreateForm$qqrp10TMetaClasspv ; TApplication::CreateForm(TMetaClass *,void *)
CODE:004451DC mov ecx, ds:off_446DD4
CODE:004451E2 mov eax, ds:off_446CDC
CODE:004451E7 mov eax,
CODE:004451E9 mov edx, off_444E70 ; == TForm1 的资源地址
CODE:004451EF call @TApplication@CreateForm$qqrp10TMetaClasspv ; TApplication::CreateForm(TMetaClass *,void *)
CODE:004451F4 mov eax, ds:off_446CDC
CODE:004451F9 mov eax, ; this
CODE:004451FB call @Forms@TApplication@Run$qqrv ; Forms::TApplication::Run(void)
CODE:00445200 call @System@@Halt0$qqrv ; System::__linkproc__ Halt0(void)
CODE:00445200 start endp
这样就可以了。
下图就是具体在文件中的修改位置了,标红框的地方(已经修改好了):
本帖最后由 solly 于 2019-6-26 08:47 编辑
160 个 CrackMe 之 141_tc.3 是由 Delphi 编译的程序,需要去除其 NAG 弹窗。其在启动和退出时都会弹出 NAG 消息框,根据 Delphi 的事件重用特性,这两个弹窗应该是同一个过程。
用 DeDe 打开也可以看到是由一个 beep 的过程处理的,我们有两种方式去除其 NAG 的显示:
方式一:
使用eXeScope 修改RCData将 TForm1 的 OnActivate 和 OnDestroy 事件删除即可去除 NAG。
如上图所示,删除选中的两行,再保存即可。
方式二:
修改事件beep()的代码,去除 MessageBoxA() 调用:
0043EFC4 .53 push ebx
0043EFC5 .8BD8 mov ebx, eax
0043EFC7 .6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0043EFC9 .68 F4EF4300 push 0043EFF4 ; |Title = "Register today !!!"
0043EFCE .68 08F04300 push 0043F008 ; |Text = "This is an unregistered Sharewareversion of CrackMe#3 (c) tC... If you want to get rid of that Nag Screen you had to buy the full version for only 500$."
0043EFD3 .A1 040C4400 mov eax, dword ptr ; |
0043EFD8 .8B00 mov eax, dword ptr ; |
0043EFDA .8B40 24 mov eax, dword ptr ; |
0043EFDD .50 push eax ; |hOwner
0043EFDE E8 7572FCFF call <jmp.&user32.MessageBoxA> ;修改这里,不弹出消息框
0043EFE3 .33D2 xor edx, edx
0043EFE5 .8B83 C8020000 mov eax, dword ptr
0043EFEB .E8 A82EFEFF call 00421E98
0043EFF0 .5B pop ebx
0043EFF1 .C3 retn
修改为:
0043EFC4 .53 push ebx
0043EFC5 .8BD8 mov ebx, eax
0043EFC7 .6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0043EFC9 .68 F4EF4300 push 0043EFF4 ; |Title = "Register today !!!"
0043EFCE .68 08F04300 push 0043F008 ; |Text = "This is an unregistered Sharewareversion of CrackMe#3 (c) tC... If you want to get rid of that Nag Screen you had to buy the full version for only 500$."
0043EFD3 .A1 040C4400 mov eax, dword ptr ; |
0043EFD8 .8B00 mov eax, dword ptr ; |
0043EFDA .8B40 24 mov eax, dword ptr ; |
0043EFDD .50 push eax ; |hOwner
0043EFDE 83C4 10 add esp, 10 ; 恢复 ESP,平衡堆栈指针
0043EFE1 8BC3 mov eax, ebx ; 恢复 EAX,这个可以不恢复,填充2个 NOP 即可。
0043EFE3 .33D2 xor edx, edx
0043EFE5 .8B83 C8020000 mov eax, dword ptr
0043EFEB .E8 A82EFEFF call 00421E98
0043EFF0 .5B pop ebx
0043EFF1 .C3 retn
本帖最后由 solly 于 2019-6-26 20:33 编辑
160 个 CrackMe 之 145_tc.11 是由 Delphi 编译的程序,需要去除启动时的 Splash 弹窗的 NAG。这个弹窗在6秒后自动关闭,并显示主窗口。
用 DeDeDark 打开看看窗体事件,如下图:
第一个事件是 AHMSplashScreen1Run,就是在这个事件中显示的 NAG,我们用 eXeScope 打开 CrackMe 查看其资源,如下图:
可以看到 TForm1的 OnCreate 事件过程就是 AHMSplashScreen1Run(),我们只要把这一行删除,然后保存即可去除 NAG。
在 DeDeDark 中还显示有一个 close 事件过程,这个过程其实是delphi第三方控件的,就是这个 AHMSplashScreen 控件,在 eXeScope 中,拖到最下面就可以看这个控件的事件,如下图:
不过不用管这个事件,对去除 NAG 没有影响。下面有一个属性DelayInMsec = 6000,就是设置延时关闭 NAG 的。
本帖最后由 solly 于 2019-7-3 10:17 编辑
160 个 CrackMe 之 142 tc.7 超时退出,修改资源破解
tc.7 是一个 Delphi 编译的 CrackMe,会在启动后超过21秒时退出。启动后在2个文本框中会有説明:
説明是20秒,但程序中设置的是21秒。
用 eXeScope 打开 CrackMe,在eXeScope 的左侧展开资源树,找到 RCData 并打开其中的 TForm1,可以看如下资源:object Form1: TForm1
Left = 192
Top = 121
Width = 281
Height = 193
AutoSize = True
Caption = 'CrackMe '
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu1
OldCreateOrder = False
OnActivate = memo_kill //删除这一行
PixelsPerInch = 120
TextHeight = 16
object Memo1: TMemo
Left = 0
Top = 0
Width = 273
Height = 73
Lines.Strings = (
'Memo1') // 改成 'Cracked'
ReadOnly = True
TabOrder = 0
end
object Memo2: TMemo
Left = 0
Top = 80
Width = 273
Height = 57
Lines.Strings = (
'Memo2') // 改成 'Cracked'
ReadOnly = True
TabOrder = 1
end
object MainMenu1: TMainMenu
Left = 256
Top = 32
object About1: TMenuItem
Caption = 'Menue'
object Exit1: TMenuItem
Caption = 'About'
OnClick = Exit1Click
end
object Exit2: TMenuItem
Caption = 'Exit'
OnClick = Exit2Click
end
end
end
object Timer1: TTimer
Enabled = False // 增加这一行
Interval = 21000
OnTimer = Timer1Timer
Left = 160
Top = 16
end
end
我在上面资源文件中进行説明了:
1、删除 OnActivate = memo_kill,这个就是去除文本框中的提示。
2、将字符串 'Memo1' 和 'Memo2' 都修改成 ‘Cracked’,表示已破解(当然这个也可以不改)。
3、在 Timer1 控件中增加一行属性:Enabled = False , 这样定时器就不会启动了,也就不会在21秒后关闭 CrackMe 了。
改好后保存资源,再次启动就正常了,如下图所示:
我编过不少delphi程序了
楼主玩得真溜
页:
[1]