《第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 <jmp.&mfc100u.#10058>
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 <jmp.&mfc100u.#1986> ; 主程序中弹出“注册码不正确的”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 <jmp.&mfc100u.#3627> ; 弹窗的call
0047F73B |. 8D8D 70FEFFFF lea ecx,[local.100] ; 通过F8回到了这里
修改关键跳后保存,发现可以正常使用了。
二、总结
1、重点是F12暂停法的使用,一定要灵活些。视频中也说了“破解不了是因为思路不正确”。理解了原理才能灵活,否则就只是模仿、记住套路。我在未看这集视频前就只会模仿前面视频中讲过的F12暂停法,只是知道怎么去做,对于为什么这么做没有想过,所以在遇到困难了就不知所措了。