吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4723|回复: 8
收起左侧

[原创] 160 个 CrackMe 之 041 -- defiler.1 的菜单Patch过程及分析

  [复制链接]
solly 发表于 2019-6-18 16:50
本帖最后由 solly 于 2019-6-19 17:18 编辑

160 个 CrackMe 之 041 - defiler.1 是一个 Delphi 编制的 CrackMe,论坛中至少已有3贴説明了,pk8900也有收集,我这里再说明一下,主要是觉得:
1、原有几种方式操作有些复杂;
2、没有充分利用 Delphi 的特性;
3、修改程序的代码量有点多。


既然是 Delphi 程序,当然先用 DeDeDark 打开看看吧:
00.png
按 rules.txt 的要求,要做一个 Exit 菜单项的事件处理。但在 DeDeDark中可以看到,“窗体”代码中,Exit 菜单项没有 OnClick 事件属性,再看看过程:
01.png
可以看到,事件过程也只有一个:About2Click,这个就是 About 的事件处理过程,因此,可以断定,CrackMe 中没的 Exit 菜单的对应事件处理过程。
我们先看看 About2Click() 事件的代码,双击上图的事件名即可打开代码查看器,如下图:
02.png
可以看到 About2Click() 函数的代码,具体内容如下:
[Delphi] 纯文本查看 复制代码
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 [url=mailto:defiler@immortaldescendants.org]defiler@immortaldescendants.org[/url]'
|
0043E277   BA94E24300             mov     edx, $0043E294
0043E27C   A1D0FB4300             mov     eax, dword ptr [$0043FBD0]
0043E281   8B00                   mov     eax, [eax]

* Reference to: forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
|
0043E283   E88CE9FFFF             call    0043CC14
0043E288   C3                     ret

在 OD 中也可以看到这段代码及其资源:
[Asm] 纯文本查看 复制代码
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 [url=mailto:defiler@immortaldescendants.org]defiler@immortaldescendants.org[/url]"
0043E27C   .  A1 D0FB4300   mov     eax, dword ptr [43FBD0]
0043E281   .  8B00          mov     eax, dword ptr [eax]
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 资源,如下图:
03.png
在左侧的资源树中,选中“TFORM1”,然后在右侧的编辑区,在 Exit1 菜单对象中,增加一行 OnClick = About2Click,如下:
[Delphi] 纯文本查看 复制代码
  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 菜单项中复制,改好后保存,如下图所示:
04.png
先择“OK”就可以了。
这样修改后,点 Exit 菜单,也会执行 About2Click() 函数,这样,我们只要修改 0x0043E270 处的 About2Click()就可以了。
用 OD 载入修改了资源的 CrackMe 程序,按 Ctrl+G,输入 0043E270,如下图所示:
05.png
我们来到了 Exit 和 About 的事件处理过程:
06.png
先在函数中的 0x0043E27C 处,下一个断点,如上图所示,再按 F9 运行 CrackMe,然后我们点击一个菜单项(About 或 Exit 均可),就会来到上面的断点。然后几个 F8 后,来到下图所示位置:
07.png
这里就是菜单处理事件回调处,如果[ebx+0x82]处为0,则表示没有指定 OnClick 事件,不用回调用户代码。如果不为0,则在 0x0042F428 处的 call 指令回调用户编写的代码。
再按多次 F8 返回到下图代码范围,往上翻,就可以看到Windows消息处理的代码,其中[esi]中保存的是消息代码,我们需要处理两个消息:WM_COMMAND 和 WM_CLOSE。我们在 0x00420285 处下一个条件断点,如下图所示:
08.png

为什么要拦截 WM_CLOSE 消息呢,因为我们要先找到 WM_CLOSE  消息的处理过程,然后才能改造 Exit 菜单的代码,用来退出 CrackMe。
经过几个来回的分析,我们确定,下图处就是 WM_COMMAND 和 WM_CLOSE 消息处理的分发处,从这里开始,进入不同的事件处理过程(jmp ecx):
09.png
上图ecx == 0x00438B68,是菜单事件处理,以及下图:
10.png

这里 ecx == 0x00438CEC,这是点击窗口右上角的关闭图标(即 WM_CLOSE)时的处理过程。
11.png

也就是 WM_COMMAND 和 WM_CLOSE 消息处理的分发,是通过一个 jmp ecx 跳转到不同的事件处理来完成的,具体代码如下:
[Asm] 纯文本查看 复制代码
00402E64   .  53            push    ebx
00402E65   .  66:8B1A       mov     bx, word ptr [edx]
00402E68   .  66:09DB       or      bx, bx
00402E6B   .  74 17         je      short 00402E84
00402E6D   .  66:81FB 00C0  cmp     bx, 0C000
00402E72   .  73 10         jnb     short 00402E84
00402E74   .  50            push    eax
00402E75   .  8B00          mov     eax, dword ptr [eax]
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 [eax]
00402E87   .  FF61 F0       jmp     dword ptr [ecx-10]
00402E8A   .  C3            retn

其中,处理 WM_CLOSE 的事件处理代码如下:
[Asm] 纯文本查看 复制代码
00438CEC   .  E8 DF0B0000   call    004398D0
00438CF1   .  C3            retn

这里看不出什么,我们用 IDA 打开 CrackMe ,通过地址找到上面代码,如下:
[Asm] 纯文本查看 复制代码
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 的值来区分是哪个组件在调用事件处理过程。通过几次观察,可以得到
[Asm] 纯文本查看 复制代码
;============= 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 处,可以找到一大片空白区域,我们在这里填充我们的事件处理代码和数据,如下图所示:
12_1.png

上图已输入了所需代码(上图的第2行的je指令还没修正偏移量,下图是修正了的),正在填充字符串数据,数据填充完后:
13.png
具体代码如下:
[Asm] 纯文本查看 复制代码
;======================================================================================
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 [url=mailto:defiler@immortaldescendants.org]defiler@immortaldescendants.org[/url]"
0043E4D4      A1 D0FB4300    mov     eax, dword ptr [43FBD0]
0043E4D9      8B00           mov     eax, dword ptr [eax]
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 [43FBD0]
0043E4F3      8B00           mov     eax, dword ptr [eax]
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,在这里返回

数据如下:
[Asm] 纯文本查看 复制代码
;---------------------------------------------------------------------------------------
0043E510  44 6F 20 79 6F 75 20 66 69 63 6B 62 69 72 6E 65  Do you fickbirne
0043E520  20 72 65 61 6C 6C 79 20 77 61 6E 74 20 74 6F 20   really want to
0043E530  71 75 69 74 3F 00 00 00 00 00 00 00 00 00 00 00  quit?...........


以上事件处理过程和数据录入完成后,就修改(0043E270)处的原事件代码,指向新的事件处理代码:
14.png
具体代码改动后,如下所示:
[Asm] 纯文本查看 复制代码
;=======================================================================================
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 [url=mailto:defiler@immortaldescendants.org]defiler@immortaldescendants.org[/url]"
0043E27C   . |A1 D0FB4300    mov     eax, dword ptr [43FBD0]
0043E281   . |8B00           mov     eax, dword ptr [eax]
0043E283   . |E8 8CE9FFFF    call    0043CC14
0043E288   . |C3             retn

搞完这些操作后,需要把这些变动保存起来,先把我们设置的所有断点禁用。
在改动了的代码上按右键,如下:
15.png
选择“复制到可执行文件==>所有修改”。会有一个确认提示:
16.png
选择“复制”,一共进行3次确认后,如下图:
17.png
再点右键,如下图:
18.png
选择”保存文件“,然后输入一个新的文件名保存即可。

我们运行刚才保存的新文件程序,击”Exit“菜单项,可以看到下面的提示:
20.png

按”是“就退出 CrackMe, 按”否“则不会退出。

下面是直接修改文件(eXeScope修改后的文件)时的地方,新事件和资源:
[Asm] 纯文本查看 复制代码
;==== 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?...........

原事件处理代码的修改:
[Asm] 纯文本查看 复制代码
;----------------------------------------------------------------------------
0003d670h: E9 4B 02 00 00 90 90 BA 94 E2 43 00 A1 D0 FB 43 ; 镵...悙簲釩.⌒鸆



分析完毕!!!

19.png

免费评分

参与人数 3威望 +1 吾爱币 +9 热心值 +3 收起 理由
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yujie0880 + 1 + 1 谢谢@Thanks!
li5511155 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| solly 发表于 2019-6-18 20:47
160 个 CrackMe 之 046 douby.exe 也是一个菜单 CrackMe。
其有三个菜单有 NAG 弹出,Crackme 非常简单,只要修一个 switch 跳转表即可:
原始跳转表:
[Asm] 纯文本查看 复制代码
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

改成新的跳转表:
[Asm] 纯文本查看 复制代码
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。
 楼主| solly 发表于 2019-6-18 21:10

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 进行修复:
[Asm] 纯文本查看 复制代码
: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 [0062], ax

上面代码中的 div cx 会导致溢出,mov cx, 0x0037 中给cx赋值太小了,改大就可了,如改成 mov cx, 0x3700,就可以正常运行了,改动如下:
[Asm] 纯文本查看 复制代码
: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 [0062], ax

将cx放大0x100倍后就运行正常:

00.png
hanlaojia 发表于 2019-6-19 08:11
 楼主| solly 发表于 2019-6-25 17:56
本帖最后由 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 中的汇编代码:
[Asm] 纯文本查看 复制代码
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, [eax]
CODE:004451BF                 call    sub_43E564
CODE:004451C4                 mov     ecx, ds:off_446DB0
CODE:004451CA                 mov     eax, ds:off_446CDC
CODE:004451CF                 mov     eax, [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, [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, [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 参数,对调一下:
[Asm] 纯文本查看 复制代码
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, [eax]
CODE:004451BF                 call    sub_43E564
CODE:004451C4                 mov     ecx, ds:off_446DB0
CODE:004451CA                 mov     eax, ds:off_446CDC
CODE:004451CF                 mov     eax, [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, [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, [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

这样就可以了。
下图就是具体在文件中的修改位置了,标红框的地方(已经修改好了):
01.png
 楼主| solly 发表于 2019-6-26 08:45
本帖最后由 solly 于 2019-6-26 08:47 编辑

160 个 CrackMe 之 141_tc.3 是由 Delphi 编译的程序,需要去除其 NAG 弹窗。其在启动和退出时都会弹出 NAG 消息框,根据 Delphi 的事件重用特性,这两个弹窗应该是同一个过程。
用 DeDe 打开也可以看到是由一个 beep 的过程处理的,我们有两种方式去除其 NAG 的显示:

方式一:
使用eXeScope 修改RCData将 TForm1 的 OnActivate 和 OnDestroy 事件删除即可去除 NAG。
00.png
如上图所示,删除选中的两行,再保存即可。

方式二:
修改事件beep()的代码,去除 MessageBoxA() 调用:
[Asm] 纯文本查看 复制代码
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 [440C04]          ; |
0043EFD8   .  8B00          mov     eax, dword ptr [eax]             ; |
0043EFDA   .  8B40 24       mov     eax, dword ptr [eax+24]          ; |
0043EFDD   .  50            push    eax                              ; |hOwner
0043EFDE      E8 7572FCFF   call    <jmp.&user32.MessageBoxA>        ;  修改这里,不弹出消息框
0043EFE3   .  33D2          xor     edx, edx
0043EFE5   .  8B83 C8020000 mov     eax, dword ptr [ebx+2C8]
0043EFEB   .  E8 A82EFEFF   call    00421E98
0043EFF0   .  5B            pop     ebx
0043EFF1   .  C3            retn

修改为:
[Asm] 纯文本查看 复制代码
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 [440C04]          ; |
0043EFD8   .  8B00          mov     eax, dword ptr [eax]             ; |
0043EFDA   .  8B40 24       mov     eax, dword ptr [eax+24]          ; |
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 [ebx+2C8]
0043EFEB   .  E8 A82EFEFF   call    00421E98
0043EFF0   .  5B            pop     ebx
0043EFF1   .  C3            retn

 楼主| solly 发表于 2019-6-26 20:31
本帖最后由 solly 于 2019-6-26 20:33 编辑

160 个 CrackMe 之 145_tc.11 是由 Delphi 编译的程序,需要去除启动时的 Splash 弹窗的 NAG。这个弹窗在6秒后自动关闭,并显示主窗口。
用 DeDeDark 打开看看窗体事件,如下图:
00.png
第一个事件是 AHMSplashScreen1Run,就是在这个事件中显示的 NAG,我们用 eXeScope 打开 CrackMe 查看其资源,如下图:
01.png
可以看到 TForm1的 OnCreate 事件过程就是 AHMSplashScreen1Run(),我们只要把这一行删除,然后保存即可去除 NAG。


在 DeDeDark 中还显示有一个 close 事件过程,这个过程其实是delphi第三方控件的,就是这个 AHMSplashScreen 控件,在 eXeScope 中,拖到最下面就可以看这个控件的事件,如下图:
02.png
不过不用管这个事件,对去除 NAG 没有影响。下面有一个属性  DelayInMsec = 6000,就是设置延时关闭 NAG 的。
 楼主| solly 发表于 2019-7-3 09:35
本帖最后由 solly 于 2019-7-3 10:17 编辑

160 个 CrackMe 之 142 tc.7 超时退出,修改资源破解
tc.7 是一个 Delphi 编译的 CrackMe,会在启动后超过21秒时退出。启动后在2个文本框中会有説明:
10.png
説明是20秒,但程序中设置的是21秒。
用 eXeScope 打开 CrackMe,在eXeScope 的左侧展开资源树,找到 RCData 并打开其中的 TForm1,可以看如下资源:
[Delphi] 纯文本查看 复制代码
object Form1: TForm1
  Left = 192
  Top = 121
  Width = 281
  Height = 193
  AutoSize = True
  Caption = 'CrackMe [id:7]'
  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 了。

改好后保存资源,再次启动就正常了,如下图所示:
11.png
冥界3大法王 发表于 2019-7-3 10:03
我编过不少delphi程序了
楼主玩得真溜
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-24 03:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表