运行
- 运行要破解的程序。
- 消息框显示两条信息:
- 删除所有Nags
- 查找registration code
- 蓝色文字要求使用SmartCheck注册。
分析
- 第一个目标使去掉Nag消息框,要去除消息框,只要操作调用消息框的函数部分即可,Visual Basic中调用消息框的函数为MSVBVM50.rtcMsgBox。
- 点击鼠标右键,Search for - All intermodular calls命令,将会列出程序中调用的API目录,选择Destination栏目,根据函数名称排序,共有4处调用要找的rtcMsgBox函数。
- 点击鼠标右键选择Set breakpoint on every call to rtcMsgBox菜单,在所有调用rtcMsgBox的代码处设置断点。
- 按下F9运行程序,程序运行到402CFE地址处停了下来,向上翻,可以看到消息框中显示的字符串,该部分就是程序开始运行时用来显示消息框的代码。
- 继续按F9运行程序,程序会弹出消息提示框,我们点击确定,程序会显出主界面,我们点击Nag?按钮,程序再次停在了00402CFE处,可以最初显示的消息框与按主画面中“Nag?"按钮显示的消息框有相同的运行代码。
- 打补丁
- 在上述代码向上翻动滚动条,可以看到402C17地址处表示函数开始的栈帧的prologue,402CFE的rtcMsgBox函数调用代码也是属于其他函数内部的代码,所以如果上层函数无法调用,或直接返回,最终将不会调用rtcMsgBox函数。
- 首先我们需要查看402C17函数的参数个数,在此处下一个断点,使程序运行到此处,确认402C17函数的起始代码存储在栈中的返回地址(7401E5A9)。
- 进入返回地址所在区域,在CALL EAX处设置一个断点,按F9使程序运行到此处,观察EAX的值。
- EAX的值为402656,进入这个地址,可以看到7401E5A7最终调用的使00402C17这个地址处的函数,CALL EAX调用前后,栈地址变得了4个字节。
- 因此我们将下面这段代码修改为:
- 至此就可以成功取出消息框。
- 查找注册码
- 随便输入内容,弹出对话框显示错误的注册码。在OllyDbg中检索错误的字符串,Search for - All referenced text strings。
- 查看00402A69处的代码,向上拖动滚动条,可以看到402A2A地址处有"I’mlena151",其下方的402A2F地址处使__vbaStrCmp()函数调用代码,__vbaStrCmp()函数使VB中比较字符串的函数,我们猜测应该使比较用户输入的字符串与"I’mlena151"字符串,因此注册码是"I’mlena151"。