逆向分析Tut.ReverseMe1

这里调试一个https://tuts4you.com/上的crackme文件Tut.ReverseMe1.exe。

运行程序查看:

逆向分析Tut.ReverseMe1_第1张图片

提示需要去除所有的Nags(唠叨)并找到正确的注册码。点击确定之后:

逆向分析Tut.ReverseMe1_第2张图片

提示使用SmartCheck进行注册。这里我们使用调试器进行调试破解。

至此,明确一下目标,第一是去掉消息框,第二是查找注册码。


使用Ollydbg打开该文件:


开始即是VB引擎代码。直接跳过该部分,使用字符串检索法查找Nag弹框显示的字符串:

逆向分析Tut.ReverseMe1_第3张图片

往上查看,直至找到栈帧生成的地方设置断点:

逆向分析Tut.ReverseMe1_第4张图片

F9运行至断点处,然后一直逐一向下调试,直至遇到如下CALL指令弹出Nag框:

逆向分析Tut.ReverseMe1_第5张图片

点击确定,再F9运行,在弹出的第二个框中点击Nag?选项,可以发现代码停留在同样的位置:

逆向分析Tut.ReverseMe1_第6张图片

因此可以确定,只需要对这一处打补丁即可。打补丁的地方是上述00402CFE地址的CALL指令。


另外,上述除了可以使用字符串检索法外,还可以使用API检索法来找到Nag弹框部分代码。

VB调用消息框的函数为MSVBVM50.rtcMsgBox,在All intermodular calls中找到该函数并全部设置断点(选中一项右键>Set breakpoint on every call to rtcMsgBox):

逆向分析Tut.ReverseMe1_第7张图片

F9运行,可以看到程序停止在断点处,上划可以看到相关的字符串内容,即是需要查找的代码区域:

逆向分析Tut.ReverseMe1_第8张图片

继续F9运行程序,和之前的操作一样,发现点击Nag?选项返回一样的地址中,即可确定四个rtcMsgBox函数只有这一个是我们需要去打补丁的。


一、下面开始通过打补丁的方式去除Nag消息框:

打补丁的方式很多,下面主要尝试两种方法。

1、直接修改调用rtcMsgBox()部分的代码:

直接将该00402CFE地址处的CALL指令修改如下


ADD指令是清理栈中rtcMsgBox()函数的参数,后面用NOP填充2个字节以保证整个修改代码的大小为5个字节,即和原本的CALL指令一样大。

F9运行后程序直接终止,原因在于没有正确处理rtcMsgBox()函数的返回值即EAX。在00402CFE地址处调用rtcMsgBox()函数后,00402D0C地址处将返回值(EAX)存储到特定变量(ESP-9C),此处消息框的返回值应该是1(表示点击“确定”),若存储的为1之外的值则程序终止(如点击“取消”的效果)。

注意一点就是,ADD ESP,14指令中的14是如何来的?在调用00402CFE地址处的CALL指令前,ESP地址为0012F9FC,调用后ESP地址为0012FA10,参数大小即为:0012FA10-0012F9FC=14(h)=20(d)。因而可以确定参数个数为20/4=5个。


当然,可以直接添加一条修改EAX为1的指令:

ADD ESP,14

MOV EAX,1

但是由于此处限制了最多只能修改5个字节,这里为8个字节,会覆盖掉后面的指令,因而无法采用。


2、修改调用rtcMsgBox()函数的上层函数代码:

从之前找到的栈帧生成的代码中可以分析得知,rtcMsgBox()函数调用代码也属于其他函数内部的代码,因而可以换种思路,修改上层函数使其无法调用rtcMsgBox()函数或直接返回,这样也可以达到同样的效果。

在栈帧生成处设置断点,运行至断点处,查看栈窗口,看到该函数的返回地址:

逆向分析Tut.ReverseMe1_第9张图片

访问该返回地址,其上一条CALL EAX指令即是调用上层函数的指令:

逆向分析Tut.ReverseMe1_第10张图片

重新运行调试,在地址7401E5A7中设置断点,运行至断点处得到EAX的值:

逆向分析Tut.ReverseMe1_第11张图片

访问EAX的地址,可以看到其下一条指令是跳转至上层函数:


也就是说,地址7401E5A7处的CALL EAX指令最终会调用地址00402C17处的上层函数。


接着确定地址7401E5A7处的CALL EAX指令的参数大小和个数。

调用前,栈地址如图:

逆向分析Tut.ReverseMe1_第12张图片

调用后,栈地址如图:

逆向分析Tut.ReverseMe1_第13张图片

因而,该指令的参数大小为:0012FAD4 - 0012FAD0 = 4

参数个数为:参数大小 / 4 = 4 / 4 = 1个

这里小结一下:32位程序中,函数调用的参数个数N = ( ESP2 - ESP1 ) / 4,其中参数大小为( ESP2 - ESP1 ),4为栈地址间的间隔大小。


确定了参数大小,便直接修改栈帧生成的代码为RETN 4(RETN + POP 4字节)指令即可:


再F9运行便直接弹出第二个需要输入注册码的框而没有弹出Nag框。

接着保存为修改为新的exe文件即可。


二、下面开始调试的第二个目标,即找出注册码

打开新保存的修改后的文件,随意输入注册码,显示注册码错误:

逆向分析Tut.ReverseMe1_第14张图片

以该错误信息进行字符串检索,查找到相应部分的代码:

逆向分析Tut.ReverseMe1_第15张图片

可以看到,在该字符串上面的部分存在__vbaStrCmp()函数调用,该函数用于字符串比较,而其前两个参数中其中一个参数为字符串“I’mlena151”,可以推测出程序是将用户输入的字符串(保存在[EBP-58]中)和该字符串进行比较,当不相等时则输出错误信息:

逆向分析Tut.ReverseMe1_第16张图片

输入该字符串查看结果:

逆向分析Tut.ReverseMe1_第17张图片

没问题,就是正确的注册码。

至此两个目标均已达成。

你可能感兴趣的:(逆向)