• 标 题:注册表医生(Registry Medic Version 2.43)破解记录  
  • 作 者:hilinw
  • 时 间:2003/07/25 12:46pm
  • 链 接:http://bbs.pediy.com

注册表医生(Registry Medic Version 2.43)破解记录
我是一个菜鸟,因为前段时间下了一个文件恢复的共享软件FileScav.exe 只能恢复32K 的文件而在网上找了很久没有找到破解。所以想开始接触到软件破解。
真心的感谢看雪老师领我入门,我是用java开发软件的,关于C,C++,VB,汇编的知识少得可怜,想想看雪老师为我们这些后辈做了这么多。我想把自己第一次成功破解的经过写下来,为后来之后来者做点微不足道的事吧。由于水平实在不好说,不对之处请高手指正。
因为我的softICE始终不能捕获断点,我用的是windows server2003,象这样的 bpx hmemcpy ,bpx getdlgitemtexta ,一点用都没有,不知道为何,还请高手指点。

先用Language 2000查过了,它没有被加壳,真是太方便。
用w32dsm打开Registry Medic,用出错信息“Registration failed. Please try again”,分析出关键的语句如下:
|:004DD4CC(C)
|
:004DD533 8B45F8                  mov eax, dword ptr [ebp-08]
:004DD536 E8A16BF2FF              call 004040DC
:004DD53B 33C0                    xor eax, eax
:004DD53D 55                      push ebp
:004DD53E 689ED64D00              push 004DD69E
:004DD543 64FF30                  push dword ptr fs:[eax]
:004DD546 648920                  mov dword ptr fs:[eax], esp
:004DD549 E8E6ECFAFF              call 0048C234
:004DD54E 8D55F4                  lea edx, dword ptr [ebp-0C]
:004DD551 8B45FC                  mov eax, dword ptr [ebp-04]
:004DD554 E8F7B3F2FF              call 00408950
:004DD559 8D55F0                  lea edx, dword ptr [ebp-10]
:004DD55C 8B45F8                  mov eax, dword ptr [ebp-08]
:004DD55F E8ECB3F2FF              call 00408950
:004DD564 8B45F4                  mov eax, dword ptr [ebp-0C]
:004DD567 E8BC69F2FF              call 00403F28
:004DD56C 83F806                  cmp eax, 00000006
:004DD56F 0F8CDF000000            jl 004DD654
:004DD575 8B45F8                  mov eax, dword ptr [ebp-08]
:004DD578 E8AB69F2FF              call 00403F28          ------à关键比较子程序(进入进去,原来是看你有没有输入注册码
-即是说你如果没有输入任何一字,就会出错了,J)
:004DD57D 83F821                  cmp eax, 00000021      ------à关键比较1
:004DD580 7C0C                    jl 004DD58E            ------à @offset 000DC980h
:004DD582 8B45FC                  mov eax, dword ptr [ebp-04]      ―――>这里把我用的任意用户名aaaaaaaaa放进去下一步要干什么呢?
:004DD585 E8BA0A0000              call 004DE044
:004DD58A 84C0                    test al, al
:004DD58C 7445                    je 004DD5D3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD580(C)
|
:004DD58E 8D45EC                  lea eax, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Registration failed. Please try "
                                       ->"again!"
                                 |
:004DD591 BAB4D64D00              mov edx, 004DD6B4
:004DD596 E8A567F2FF              call 00403D40
:004DD59B 6A30                    push 00000030
:004DD59D 8D55E8                  lea edx, dword ptr [ebp-18]
:004DD5A0 A1D4794F00              mov eax, dword ptr [004F79D4]
:004DD5A5 8B00                    mov eax, dword ptr [eax]
:004DD5A7 E8D80EF7FF              call 0044E484
:004DD5AC 8B45E8                  mov eax, dword ptr [ebp-18]
:004DD5AF E8386BF2FF              call 004040EC
:004DD5B4 50                      push eax
:004DD5B5 8B45EC                  mov eax, dword ptr [ebp-14]
:004DD5B8 E82F6BF2FF              call 004040EC
:004DD5BD 50                      push eax
:004DD5BE A1D4794F00              mov eax, dword ptr [004F79D4]
:004DD5C3 8B00                    mov eax, dword ptr [eax]
:004DD5C5 8B4024                  mov eax, dword ptr [eax+24]
:004DD5C8 50                      push eax

* Reference To: user32.MessageBoxA, Ord:0000h
                                 |
:004DD5C9 E8CA9DF2FF              Call 00407398
:004DD5CE E9B0000000              jmp 004DD683

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD58C(C)
|
:004DD5D3 8B55F8                  mov edx, dword ptr [ebp-08]    ―――>放入我输入的假注册码:char[033]:"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
:004DD5D6 8B45F4                  mov eax, dword ptr [ebp-0C]    ―――>放入我输入的假注册号:char[009]:"aaaaaaaaa"
:004DD5D9 E81EE3FAFF              call 0048B8FC   ------à进去一看原来是写注册表。oftWare\Classes\CLSID\{B087CE89-A8EE-4890-91E7-696B3F749500}
值:11C806F5B6245C4FE380-DA5118195B3FDB12D582-0BEE6E218D1D4D95C7-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
:004DD5DE E851EEFAFF              call 0048C434   ------à关键比较子程序我没有去细看。想应是比较注册码了。
:004DD5E3 A1D4774F00              mov eax, dword ptr [004F77D4]
:004DD5E8 803800                  cmp byte ptr [eax], 00   ------à关键比较2
:004DD5EB 7425                    je 004DD612             ------à @offset 000DC9EBh
:004DD5ED A158784F00              mov eax, dword ptr [004F7858]
:004DD5F2 833800                  cmp dword ptr [eax], 00000000   ------à关键比较3
:004DD5F5 740C                    je 004DD603             ------à @offset 000DC9F5h
:004DD5F7 A158784F00              mov eax, dword ptr [004F7858]
:004DD5FC 8B00                    mov eax, dword ptr [eax]
:004DD5FE E8D5D6FFFF              call 004DACD8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD5F5(C)
|
:004DD603 8D45EC                  lea eax, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Thank you for registering Registry "
                                       ->"Medic."        ---------------->这是成功的标志!
                                 |
:004DD606 BAE4D64D00              mov edx, 004DD6E4
:004DD60B E83067F2FF              call 00403D40
:004DD610 EB0D                    jmp 004DD61F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD5EB(C)
|
:004DD612 8D45EC                  lea eax, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Registration failed. Please try "
                                       ->"again!"      -------------------à这句关键的话出现了两次!难道有两个地方比较?
                                 |
:004DD615 BAB4D64D00              mov edx, 004DD6B4
:004DD61A E82167F2FF              call 00403D40


根据以上分析,先爆码吧,在
:004DD5EB 7425                    je 004DD612             ------à @offset 000DC9EBh
用hiew 找到 DC9EB 处,你一定知道改为 7525,我没有试,我在这里是改为740C.为什么也可以?你看到上面这句以下不远的这句了吧:这是跳到注册成功的地方。
:004DD5F5 740C                    je 004DD603             ------à @offset 000DC9F5h
这是说我这种改法是让注册码写得不对就跳到注册成功的地方去。
看来应该收工了!运行来试试。随便输入一下注册码。没有任何消息就退出了(这里注意,如果不用我这种改法,如果将7425改为9090,或者7525是会出一个注册成功的对话框的)。下次再启动,依然要求注册。怎么回事?
我想到它刚才的注册表里写了信息,并且把我写的任意非正确的注册码写进去了,是不是有关呢,我先再注册一次,成功后不急着运行Registry Medic,先试着把找到注册表中B087CE89-A8EE-4890-91E7-696B3F749500项。把其中AppIdK值:11C806F5B6245C4FE380-DA5118195B3FDB12D582-0BEE6E218D1D4D95C7-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,删除了,现在才运行Registry Medic,呵呵,你猜怎么着,成功了,没有出现那个注册框了。
呵呵,看来,作者怕被破解先在注册表上写上你的注册信息了,启动时会先去找出来和正确的注册码比较,如果不对,还是会向你要正确的注册码的。