运行程序:
输入Name和Serial:
这里的Run-time error让人感觉程序好像出了一点bug,因为按照正常的逻辑应该是提示错误或正确信息。
把程序拖进OD:
哈?程序好像有点玄机的样子。用PEid查壳,无壳~
查看strings……嗯,发现了这个:
=======分割线内是个坑,读者可略去,因为我也没啥头绪=======
如果程序没有发生Run-time error的话,那么肯定会执行到上图string对应的地方。现在既然没有弹出与上图string有关的对话提示框,那肯定程序逻辑在对话框弹出之前就发生了Run-time error。
往jz指令上方找。嗯,找到一个可疑的jmp指令:
于是在0040860E处打断点,进行验证。
咦,竟然没有在断点处停下。。。。好吧,那就只好不断地往上滑动代码,直到看到ret指令:
打断点~我倒要看看,程序会不会执行到这里来。
嗯~果然执行到这里了。好,单步执行,看到底啥时候发生Run-time error。
当执行到这里时,发生了Run-time error:
Step into进去:
在这里发生异常,于是又Step into进行查看…反复几次…最终定位到这里:
好吧,其实对于为什么会触发异常,我真的不是很明白啊啊啊啊……
于是百度了一下其他人的做法,我发现别人根本就没有纠结这个问题,因为他们输入的Serial是数字!!!!!!而我输入的是字母!!!!!
===========此坑完结,等我能逆代码逻辑的时候再来分析此处吧===========
至此,破解序列码这个环节已经没有难度了=。=
好,现在来去掉那个烦人的Nag。。因为每次它都要保持好几秒……估计程序用了个timer之类的东西,而设置timer这个动作势必会调用系统api。
所以查看所有系统调用的Names,定位到这里:
再双击定位到代码处:
执行返回到调用处:
要想去掉Nag,可以把延时参数设置为0,即把00001B58改了。查找referenced constants 00001B58:
改为0。再运行,发现不行哎。再看这个地址7406DAAB,估计这个地址OD修改无效吧。
于是用WinHex打开程序,寻找581B,定位到这里:
强制把值改为全0。再另存为,运行。咦,Nag怎么一直保持了呢?哈,timeout参数设置为0时表示定时器永久保持了。。。囧。。。。
那就把值改得小一点吧。。好,重新另存为,运行,嗯,搞定!