注册表医生(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,呵呵,你猜怎么着,成功了,没有出现那个注册框了。
呵呵,看来,作者怕被破解先在注册表上写上你的注册信息了,启动时会先去找出来和正确的注册码比较,如果不对,还是会向你要正确的注册码的。