第11章 Tut.ReverseMe1

1. 运行

弹出消息对话框,显示2条信息.

  • 删除所有烦人的Nags
  • 查找registration code
    选择"确认"按钮,显示主窗口

2. 分析

2.1 目标(1) : 去除消息框

使用OllyDbg打开文件,从00401162地址处看到主函数ThunRTMain.
EP代码

要去除消息框,只要操作调用消息框的函数部分.Visual Basic中调用消息框的函数为MSVBVM50.rtcMsgBox.

在OllyDbg中使用鼠标右键菜单的Search for-All intermodular calls命令,将会列出程序中调用的API目录.
All  intermodular  calls

根据函数名称排序,共有四处调用要找到的函数rtcMsgBox.选择鼠标右键菜单中的Set breakpoint on every call to rtcMsgBox菜单,在所有调用rtcMsgBox的代码处设置断点,如图.
在所有调用rtcMsgBox的代码处设置断点

然后在调试器中按F9键运行程序,程序运行到设有断点的地方停下来.
运行到402CFE地址处停止

向上拉一下滚动条,可以看到消息框显示的字符串,该部分就是程序开始运行时用来显示消息框的代码部分.

2.2 打补丁(1) : 去除消息框

第一次尝试
先修改402CFE地址处的CALL命令,如下图示.
402CFE地址处

修改后,402CFE地址处的ADD,ESP,14命令的含义是,按照传递给rtcMsgBox()参数的大小(14)清理栈.并用NOP填充其余两个字节,以保证代码不会乱(原来CALL命令的大小为5个字节,ADD命令用3个字节,还余下2个字节).

但这样修改是错误的,原因是没有正确处理rtcMsgBox()函数的返回值(EAX寄存器).

第二次尝试

可以看到402C17地址处表示函数开始的栈帧prologue.
402C17地址

402CFE的rtcMsgBox函数调用代码也是属于其他函数内部的代码.所以如果上层函数无法调用,或直接返回.最终将不会调用rtcMsgBox函数.像下面这样修改401C17处的指令

原来

修改后

注意
要根据传递给函数的参数大小调整栈(RETN XX).

此时就成功去除消息框.

2.3 目标(2) : 查找注册码

随便输入一个abcd1234,会弹出错误消息框.
错误消息框

在OllyDbg中检索消息字符串,查看402A69地址处的代码,双击鼠标得到.
402A69地址处的代码

看图中代码,402A2A地址处有`I'mlena151字符串,其下方的402A2F地址处是vbaStrCmp()函数调用代码.vbaStrCmp()API是VB中比较字符串的函数,在本例中用于比较用户输入的字符串与I'mlena151字符串作为比较,我们再向上拖动滚动条.

在4028BD处也存在I'mlena151字符串,可以肯定该字符串就是正确的注册码.

成功消息框