1. 运行
弹出消息对话框,显示2条信息.
- 删除所有烦人的Nags
- 查找registration code
2. 分析
2.1 目标(1) : 去除消息框
使用OllyDbg打开文件,从00401162地址处看到主函数ThunRTMain
.
要去除消息框,只要操作调用消息框的函数部分.Visual Basic中调用消息框的函数为MSVBVM50.rtcMsgBox
.
在OllyDbg中使用鼠标右键菜单的Search for-All intermodular calls命令,将会列出程序中调用的API目录.
根据函数名称排序,共有四处调用要找到的函数rtcMsgBox.选择鼠标右键菜单中的Set breakpoint on every call to rtcMsgBox菜单,在所有调用rtcMsgBox的代码处设置断点,如图.
然后在调试器中按F9键运行程序,程序运行到设有断点的地方停下来.
向上拉一下滚动条,可以看到消息框显示的字符串,该部分就是程序开始运行时用来显示消息框的代码部分.
2.2 打补丁(1) : 去除消息框
第一次尝试
先修改402CFE地址处的CALL命令,如下图示.
修改后,402CFE地址处的ADD,ESP,14命令的含义是,按照传递给rtcMsgBox()参数的大小(14)清理栈.并用NOP填充其余两个字节,以保证代码不会乱(原来CALL命令的大小为5个字节,ADD命令用3个字节,还余下2个字节).
但这样修改是错误的,原因是没有正确处理rtcMsgBox()函数的返回值(EAX寄存器).
第二次尝试
可以看到402C17地址处表示函数开始的栈帧prologue.
402CFE的rtcMsgBox函数调用代码也是属于其他函数内部的代码.所以如果上层函数无法调用,或直接返回.最终将不会调用rtcMsgBox函数.像下面这样修改401C17处的指令
注意
要根据传递给函数的参数大小调整栈(RETN XX).
此时就成功去除消息框.
2.3 目标(2) : 查找注册码
随便输入一个abcd1234
,会弹出错误消息框.
在OllyDbg中检索消息字符串,查看402A69地址处的代码,双击鼠标得到.
看图中代码,402A2A地址处有`I'mlena151
字符串,其下方的402A2F地址处是vbaStrCmp()函数调用代码.vbaStrCmp()API是VB中比较字符串的函数,在本例中用于比较用户输入的字符串与I'mlena151
字符串作为比较,我们再向上拖动滚动条.
在4028BD处也存在I'mlena151
字符串,可以肯定该字符串就是正确的注册码.