论坛: 编程破解 标题: 今天和大家说破解WinImageV5.0的步骤。有点难度,我觉得! 复制本贴地址    
作者: 星痕 [jrg1982]    论坛用户   登录
1. 用softice载入windows(通过CTRL+D来检查softice是否已经准备好,按F5退出softice);

2. 运行WinImage,选择“Options”下的“Registering...”进行注册;

3. 在“Name:”中输入:Xingheng(随意),“Registration code:”中输入:12345678(随意);

4. 用CTRL+D呼出softice,下万能断点:bpx hmemcpy,按F5返回到WinImage;

5. 在WinImage中点击“OK”,很快程序就被softice拦截下来;

6. 用 bd * 暂停断点 bpx hmemcpy ;

7. 按F12键9次,返回到WinImage的领空,程序停留在下面的地方:
。。。
0167:0042F08F MOV EDI,00443D18            <-- 程序停在这里
0167:0042F094 PUSH 7F
0167:0042F096 PUSH EDI
0167:0042F097 PUSH 00000817
0167:0042F09C PUSH [EBP+08]
0167:0042F09F CALL ESI
0167:0042F0A1 PUSH 004440E8
0167:0042F0A6 PUSH EDI                 <-- EDI指向我们输入的注册码“12345678”
0167:0042F0A7 PUSH EBX                 <-- EBX指向我们输入的用户名“Xingheng”
0167:0042F0A8 CALL 004347C9
0167:0042F0AD MOV ECX,DWORD PTR [004440E8]
0167:0042F0B3 ADD ESP,0C
0167:0042F0B6 XOR EDX,EDX
0167:0042F0B8 MOV DWORD PTR [00443EDC],EAX
0167:0042F0BD CMP EAX,EDX
0167:0042F0BF POP EDI
0167:0042F0C0 POP EBX
0167:0042F0C1 JZ 0042F0C9
。。。

8. 简单分析一下:来到WinImage的领空,你会发现下面CALL 004347C9后面有个跳转指令JZ,而指令XOR EDX,EDX;MOV DWORD PTR [00443EDC],EAX和CMP EAX,EDX的作用其实相当于TEST EAX,EAX,说明其前面的子程序CALL 004347C9值得怀疑?

9. 按F10走到0167:0042F0A8 CALL 004347C9停下,然后用 D EDI 和 D EBX 命令,可以看到EDI指向的内存地址中藏着我们输入的注册码“12345678”,而EBX指向的内存地址中则是我们输入的用户名“Xingheng”,所以这个CALL很可能就是进行注册码判断的子程序;

10. 我们可以试探一下这个CALL的作用:首先将鼠标在0167:0042F0A8 CALL 004347C9这行上点击一下,按F9在此设置断点,免得呆会儿跑冤枉路,还要从头再来;然后继续按F10走到0167:0042F0B8 MOV DWORD PTR [00443EDC],EAX停下,此时我们可以看到EAX=0,所以走下去的话程序就会跳到0042F0C9(因为EAX=EDX=0)。我们的目的是改变程序的走向,所以这时将鼠标移到Softice寄存器区,直接点击EAX,将其值改为EAX=00000001,接着将鼠标在程序代码区点击一下,按F5让程序自己去跑,结果你会看到WinImage弹出消息框告诉你注册成功--“Your registration code is valid”。哈哈。。。不用说CALL 004347C9 一定是判断注册码的子程序,让我们杀进去看看;(也许你会问:要改程序的运行方向还不简单吗?只要走到0167:0042F0C1 JZ 0042F0C9 时用 RFL Z 命令改变零标志位的状态就可以了嘛!--通常这样的方法可以凑效,但是你发现没有:0167:0042F0B8 MOV DWORD PTR [00443EDC],EAX 处的指令先将EAX的返回值保存了起来,然后才去和EDX比较,说明后面程序还会用到这个EAX的值,所以简单的用 RFL Z 是不能搞定的。这一点你可以自己去试,其结果完全相反,WinImage会警告注册码错误--“Registering information is invalid”)

11. 重新输入用户名“Xingheng”和注册码“12345678”,按“OK”键,程序立即被Softice中断在0167:0042F0A8 CALL 004347C9这条指令上(因为刚才我们按F9在这里设置了断点),按F8进入到这个CALL 004347C9里面去:
。。。
0167:004347C9 PUSH EBP                <-- 程序停在这里
0167:004347CA MOV EBP,ESP
0167:004347CC SUB ESP,00000200
0167:004347D2 PUSH ESI
0167:004347D3 MOV ESI,DOWRD PTR [EBP+10]
0167:004347D6 TEST ESI,ESI
0167:004347D8 PUSH EDI
0167:004347D9 JZ 004347DE
0167:004347DB AND DWORD PTR [ESI],00000000
0167:004347DE PUSH [EBP+0C]
0167:004347E1 LEA EAX,DWORD PTR [EBP+FFFFFF00]
0167:004347E7 PUSH EAX
0167:004347E8 CALL 004346CD
0167:004347ED PUSH [EBP+08]
0167:004347F0 CALL 004346F9
0167:004347F5 MOV EDI,EAX
0167:004347F7 ADD ESP,0C
0167:004347FA CMP EDI,B8DCDD26
0167:00434800 JZ 00434904
0167:00434806 LEA EAX,DWORD PTR [EBP+FFFFFF00]
0167:0043480C PUSH EAX               <-- EAX指向我们输入的注册码“12345678”
0167:0043480D LEA EAX,DWORD PTR [EBP+FFFFFE00]
0167:00434813 PUSH EDI
0167:00434814 PUSH EAX
0167:00434815 CALL 0043477C
0167:0043481A POP ECX
0167:0043481B POP ECX
0167:0043481C PUSH EAX               <-- EAX指向字符串“7698AE”
0167:0043481D CALL 00437BA0
0167:00434822 POP ECX
0167:00434823 TEST EAX,EAX
0167:00434825 POP ECX
0167:00434826 JZ 004348CC
。。。

12. 按F10往下走,用 D 寄存器名 指令查看内存数据,你会发现没有什么特别的地方。直到0167:0043480C PUSH EAX时会发现 EAX指向的内存中是我们输入的注册码“12345678”,由此看来程序就要开始判断注册码了。继续往下走,到了0167:0043481C PUSH EAX处用 D EAX 命令,可以在内存中发现一串可疑的字符“7698AE”,并且接着是一个子程序CALL 00437BA0,然后程序又根据TEST EAX,EAX的结果决定走向;

13. 我们有理由相信“7698AE”就是正确的注册码,用笔赶紧记下先。为了验证我们的猜想,暂且用F9在0167:0043481C PUSH EAX处设置断点,然后按F10走到最后一条指令0167:00434826 JZ 004348CC停下,用 RFL Z 指令改变程序的走向,接着再用F5让程序自己往下跑,结果是什么呢^_^-- WinImage再次出现注册成功的信息--“Your registration code is valid”,OK了,“7698AE”就是正确的注册码;

14. 已经拿到了正确的注册码,那么是否就此结束了呢?再一次重新输入用户名“Xingheng”和注册码“12345678”,按“OK”键,程序又立即被Softice拦截到,按F5返回,WinImage又会被拦截下来停在步骤11的0167:0043481D CALL 00437BA0指令处;(知道为什么吗?因为我们用了两次F9设置断点,所以第二次才会来到上面的地方)

15. 仔细按F10往下走,你会发现还有好几个跟步骤11后半部分程序相似的程序段,每次都能在子程序CALL 00437BA0前的寄存器EAX指向的内存中发现一个又一个的注册码(其实就是注册码“7698AE”的内存地址,只要不停的按F10,你会看到其它注册码依次在“7698AE”的内存地址中变化);

16. 跟踪完注册码子程序后,我们能发现输入的用户名“Xingheng”对应的正确注册码依次有:7698AE、147884F6、177C8502、1078852F、4778543、27C8545,怎么样,爽吧^_^!

17. 如果你在前面已经不小心用正确的注册码注册了WinImage,你将不能再次进入注册选项,即使删掉程序也不行。解决的办法是:删掉注册表 HKEY_USERS\.DEFAULT\Software\WinImage下的“CodeRegistered”和“NameRegistered”键值即可;

18. 收尾事宜:别忘了用 BC * 来清除在Softice中设置的断点。


地主 发表时间: 02/07 00:58

回复: cyh811122 [cyh811122]   论坛用户   登录
这个朋友的汇编水平很厉害呀!

B1层 发表时间: 02/08 20:40

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号