|
![]() | 作者: jrg1982 [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号