《第3期-13 F12暂停法详解》学习笔记

一、破解过程
1、打开软件后,有一个提示注册的,输入假码后,弹窗“对不起,您输入的注册码文本是不正确的”。


2、载入OD,查找字符串“注册”,发现找不到。

3、这可从哪里入手呢?正好有一个弹窗,可以试试F12暂停法。
回到OD,按F12,从而让程序暂停,再按Alt+K


选择其中的那个MessageBoxExW,右键——“显示调用”,下断点。
重新载入程序,再次输入假码后断下来了,然后F8一下,回到程序点击对话框的“返回”按钮,这时OD会自动往下运行一下,接下来就是一路F8单步,直到OD的标题栏变成这样


说明回到了程序领空了。
4、找到了弹窗的call了,向上找是否有跳转能够跳过它的。

00532F1E  |.  E8 7D83FFFF   call    0052B2A0                         ;  关键call
00532F23  |.  85C0          test    eax,eax
00532F25  |.  74 2F         je      short 00532F56                   ;  关键跳
00532F27  |.  8B0D CC557300 mov     ecx,dword ptr ds:[0x7355CC]      ;  HprSnap7.0072AE98
00532F2D  |.  8981 58020000 mov     dword ptr ds:[ecx+0x258],eax
00532F33  |.  8B56 20       mov     edx,dword ptr ds:[esi+0x20]
00532F36  |.  52            push    edx                              ; /hWnd
00532F37  |.  FF15 6C806500 call    dword ptr ds:[<&USER32.OpenClipb>; \OpenClipboard
00532F3D  |.  85C0          test    eax,eax
00532F3F  |.  74 0C         je      short 00532F4D
00532F41  |.  FF15 58806500 call    dword ptr ds:[<&USER32.EmptyClip>; [EmptyClipboard
00532F47  |.  FF15 5C806500 call    dword ptr ds:[<&USER32.CloseClip>; [CloseClipboard
00532F4D  |>  8BCE          mov     ecx,esi
00532F4F  |.  E8 EE8C1000   call    
00532F54  |.  EB 0E         jmp     short 00532F64
00532F56  |>  6A FF         push    -0x1
00532F58  |.  6A 00         push    0x0
00532F5A  |.  68 85690000   push    0x6985
00532F5F  |.  E8 B2851000   call                 ;  主程序中弹出“注册码不正确的”call
00532F64  |>  8D4D F0       lea     ecx,[local.4]
00532F67  |.  FF15 3C8A6500 call    dword ptr ds:[<&mfc100u.#903>]   ;  mfc100u.#14057

在关键跳处下断点,重新载入程序,发现关键跳是已实现的,那么就把它给nop掉。确实不会弹窗了,可是程序一用还是会加水印,说明还是试用版的。
5、关键跳不行,那么就看看关键call。
在关键call里面下断点,重新载入程序,F8单步下去,发现关键call里面代码太多了,但是返回值放到eax中为0。那么修改返回值为1是不是可行呢?
再加上这个关键call被很多地方调用了,所以前面只是修改关键跳是不够用的。


于是把关键call的段首改为

mov eax, 1
retn 0x14

这个retn是跟到了关键call的末尾才找到是返回0x14的。
6、发现这样就可以了,程序截图也是没有水印了。
可是在启动软件时还是会弹窗的,看了视频中的讲解,才知道自己的思路和视频中的不太一样。
7、把程序重新载入OD,当启动界面出来后,回到OD中按F12暂停,再Alt+K:


选择图片中的函数,右键——“显示调用”,来到了一段代码,在断尾下断点。至于为何在断尾下断点,我认为是想运行到断尾处,跳出这个call,所以直接在断尾下断点,省得在中间下了断点还得再F8单步了。
重新载入程序后,总是会断在断点处。可以取消这个断点,F8单步从而跳出了这段代码,来到了新的代码处。这时才发现,刚才是断在一个call里面来着。


F8单步一会,我们发现在一个循环里面,跳不出去呀!只好在再次在这段代码的段尾下断点了。
重新载入程序,需要点击启动界面中的一个按钮,这样OD才会断下来。因为程序直接弹出了启动界面让我们点击,所以需要点击里面的一个按钮,OD才会断下来。
F8单步,会发现又出了状况:本来是F8单步着,突然OD显示运行了,F8也不管用了。视频中给出的方法是在下面的代码下断点,Alt+t然后右键激活所有线程就好了。
来到了程序的领空

0047F6E9  |. /75 04         jnz     short 0047F6EF                   ;  这个跳跳过了下面的跳。需要nop掉。
0047F6EB  |. |85C0          test    eax,eax
0047F6ED  |. |75 63         jnz     short 0047F752                   ;  这个跳转能够跳过下面的弹窗call。需要改为jmp
0047F6EF  |> \8B4B 20       mov     ecx,dword ptr ds:[ebx+0x20]
0047F6F2  |.  6A 00         push    0x0
0047F6F4  |.  56            push    esi
0047F6F5  |.  51            push    ecx
0047F6F6  |.  8D8D 70FEFFFF lea     ecx,[local.100]
0047F6FC  |.  E8 8FDD0A00   call    0052D490
0047F701  |.  68 70C86500   push    0065C870                         ;  h
0047F706  |.  8D8B 54010000 lea     ecx,dword ptr ds:[ebx+0x154]
0047F70C  |.  C645 FC 20    mov     byte ptr ss:[ebp-0x4],0x20
0047F710  |.  FF15 E08C6500 call    dword ptr ds:[<&mfc100u.#2614>]  ;  mfc100u.#2614
0047F716  |.  85C0          test    eax,eax
0047F718  |.  7E 16         jle     short 0047F730
0047F71A  |.  B8 1D000000   mov     eax,0x1D
0047F71F  |.  8D56 FF       lea     edx,dword ptr ds:[esi-0x1]
0047F722  |.  3BC2          cmp     eax,edx
0047F724  |.  1BC0          sbb     eax,eax
0047F726  |.  F7D0          not     eax
0047F728  |.  23C6          and     eax,esi
0047F72A  |.  8983 20030000 mov     dword ptr ds:[ebx+0x320],eax
0047F730  |>  8D8D 70FEFFFF lea     ecx,[local.100]
0047F736  |.  E8 13BC1B00   call                 ;  弹窗的call
0047F73B  |.  8D8D 70FEFFFF lea     ecx,[local.100]                  ;  通过F8回到了这里

修改关键跳后保存,发现可以正常使用了。

二、总结
1、重点是F12暂停法的使用,一定要灵活些。视频中也说了“破解不了是因为思路不正确”。理解了原理才能灵活,否则就只是模仿、记住套路。我在未看这集视频前就只会模仿前面视频中讲过的F12暂停法,只是知道怎么去做,对于为什么这么做没有想过,所以在遇到困难了就不知所措了。

你可能感兴趣的:(《第3期-13 F12暂停法详解》学习笔记)