7. 按F12键9次,返回到winzip的领空(因为刚才softice中断在hmemcpy中,这是windows系统区域,不能更改的,winzip仅仅是调用这个功能而已,所以我们必须要返回到winzip程序中才有用),来到下面的地方: ...... 0167:00407F6D CALL [USER32!GetDlgItemTextA] 0167:00407F73 PUSH EDI ←- 程序停留在这里,EDI指向“KraneXH” 0167:00407F74 CALL 0043F89A 0167:00407F79 PUSH EDI 0167:00407F7A CALL 0043F8C3 0167:00407F7F POP ECX 0167:00407F80 MOV ESI, 0048CDA4 0167:00407F85 POP ECX 0167:00407F86 PUSH 0B 0167:00407F88 PUSH ESI 0167:00407F89 PUSH 00000C81 0167:00407F8E PUSH EBX 0167:00407F8F CALL [USER32!GetDlgItemTextA] 0167:00407F95 PUSH ESI ←- ESI指向“12345678” 0167:00407F96 CALL 0043F89A 0167:00407F9B PUSH ESI 0167:00407F9C CALL 0043F8C3 0167:00407FA1 CMP BYTE PTR [0048CD78],00 ←- [0048CD78]指向“KraneXH” 0167:00407FA8 POP ECX 0167:00407FA9 POP ECX 0167:00407FAA JZ 00408005 0167:00407FAC CMP BYTE PTR [0048CDA4],00 ←- [0048CDA4]指向“12345678” 0167:00407FB3 JZ 00408005 0167:00407FB5 CALL 00407905 0167:00407FBA TEST EAX,EAX 0167:00407FC3 JZ 00408005 ......
8. 我们从调用hmemcpy的系统区域中返回到winzip领空时,程序停留在0167:00407F73 PUSH EDI上,看看它上面的那条指令0167:00407F6D CALL [USER32!GetDlgItemTextA],这个CALL就是取我们输入数据的程序,也就是这个CALL让我们用 bpx hmemcpy 将winzip拦截了下来。既然winzip用这个CALL去取输入的东西,那么调用之后肯定会返回结果的,让我们来看看:用 D EDI ,观察softice的数据区,你会看到EDI指向的内存区域的内容是我们输入的名字“KraneXH”;
9. 从程序中可看出,下面不远的地方还有一个同样的地方调用USER32!GetDlgItemTextA,既0167:00407F8F CALL [USER32!GetDlgItemTextA]这一行。按F10键多次,走到这个CALL的下一句停下,既程序停在0167:00407F95 PUSH ESI这条指令上,用 D ESI ,同样的我们可以看到ESI指向的内存区域的内容是我们输入的注册码“12345678”。现在winzip已经将我们输入的名字和注册码都取到,让我们来看看它下一步要做什么?
10. 继续按F10多次,当程序走到0167:00407FA1 CMP BYTE PTR [0048CD78],00时停下来,这条指令将内存0048CD78中的数据和00比较,然后根据比较结果判断程序走向。用 D 0048CD78,观察softice的数据区,我们可以看到0048CD78中的数据是“KraneXH”,现在我们知道这条指令的作用是判断我们输入的名字是否为空,如果没有输入任何东西,程序将会跳到00408005去;同样的,按F10走到0407FAC CMP BYTE PTR [0048CDA4],00这行停下,然后用 D 0048CDA4,可以看到0048CDA4中的数据是“12345678”。因为我们输入了名字和注册码,所以程序不会跳到 00408005去,程序检查输入的名字和注册码,如果任何一个没有输入(既其值为00),程序都会跳到00408005去,由此我们应该想到00408005很可能就是显示出错的地方,即当程序走到00408005 的时候,表示输入的名字和注册码是错误的;
15. 大家一定会问:为什么会在这里停下,而不是其它地方呢?因为我在前面的程序中已经用 D *** 看过了,没有发现什么可疑的呀^_^!
按F10走到0167:00407A99 CALL 00407B47处,用 D EAX 和 D EDI 观察其里面是什么?可以看到EDI指向我们输入的名字“KraneXH”,EAX指向的内存区域没有什么特别的数据;紧接着下面的CALL 00407B47 会对“KraneXH”进行一些处理,具体的 我们还不知道,继续往后走;
16. 按F10走到0167:00407AAB CALL 004692D0这一句,然后用 D ESI 和 D EAX 查看内存中的数据,可以看到ESI指向我们输入的注册码“12345678”,而EAX指向另外一串字符“5CFC0875”。不用说,十有八九这就是正确的注册码了,赶紧把它写在纸上吧^_^!继续往下走,我们会在下面的地方紧接着发现另外一个类似程序段,从而得到另外一串码“23804216”;