一位名叫Lena的人在 http://www.tuts4you.com/ 公示板上贴了40个crackme讲座,以帮助初学者学习代码逆向分析技术。这些讲座非常受欢迎,因为所有讲座都以Flash视频形式呈现出来,且让学习者感到非常亲切。各位可以链接到tuts4you网站观看这些视频讲座,这对学习代码逆向分析技术非常有帮助。
运行要破解的程序 给我们了两条信息
就是说叫我们 去除提示框 并找到正确的注册码
打开后发现也是用VB编写的软件,因为我们在EP中发现了 ThunRTMain
而且我们知道VB中调用消息框的函数是 rtcMsgBox
然后我们在调用模块中去查找,可以发现有三次调用此函数
在每一处调用都设置一个断点
然后运行程序
发现程序在 402CFE
处断了下来,此时应该就是要调用函数进行显示消息了。那么上面多半就有要显示的消息。果不其然,上面确实可以发现将要显示的消息
然后我们继续运行,我们找一下程序中点击 nag?
按钮后的断点在哪里
发现还是断在了 402CFE
处。那么我们只要对这一处进行修复即可
我们先修改 402CFE
处的call命令
原来的
修改后的
402CFE
地址处的ADD ESP,14
命令的含义是,按照传递给rtcMsgBox
参数的大小(14)清理栈。并用NOP填充其余2个字节,以保证代码不会乱(原来CALL命令的大小为5字节,ADD命令用3个字节,还余下2个字节)。
看上去没有什么问题,但结果却“发生错误”。原因在于没有正确处理 rtcMsgBox
函数的返回值(EAX寄存器)。
如图,在 402CFE
地址处调用 rtcMsgBox
函数后,402D0C
地址处将返回值(EAX)存储到特定变量(EBP-9C)。此处消息框的返回值应该是1(表示“确定”按钮)。若存储的为1之外的值,则表示程序终止。那么最好试试其他方法。
(1)可以修改402CFE地址处的指令,如下所示。
ADD ESP,14
(Instruction:83C414)
MOV EAX,1
(Instruction:B801000000)以上两行汇编代码产生的结果与调用
rtcMsgBox
函数后用户按“确定”按钮的结果相同(栈与返回值相同)。之所以没有这样做是因为指令长度不合适。源文件402CFE
地址处的命令长度为5字节,但上面2行汇编命令的长度为8个字节,因此会侵占到后面的代码。(2)x86(IA-32)系统中使用EAX寄存器传递函数的返回值。
在断点处向上看可以发现 402C17
处表示函数开始的栈帧
402CFE
的 rtcMsgBox
函数调用代码也是属于其他函数内部的代码。所以如果上层函数无法调用,或直接返回,最终将不会调用 rtcMsgBox
函数。像下面这样修改401C17
处的指令(使用AssembleSpace指令)。
原来的
修改后
要根据传递给函数的参数大小跳转栈 (RETN XX)
然后运行 发现就去除了消息框
首先找到 402C17
处函数的返回地址,在 402C17
下个断点,并运行到这里
然后可以在栈空间看到返回的地址是 7401E5A9
goto过去看返回地址上一条命令。即执行此命令后就完成 402C17
函数。并返回地址到 7401E5A9
如图所示 返回地址 (7401E5A9)
。该代码区域是 MSVBVM50.dll
模块区域。执行 7401E5A7
地址处的 CALL EAX
指令后即返回 7401E5A9
地址处。再次运行调试器(Ctrl+F2),在 7401E5A7
地址处设置断点后运行程序(F9),可以得知EAX的值为402656
此时会进入一个函数内部,并跳转到 402656
地址处,
然后我们使用 ctrl+f9
发现最后会回到 402C17
地址处
所以调用 call eax
就是在调用 402c17
地址处的函数,那么我们只要确认 CALL EAX
命令(7401E5A7)调用前后的栈地址即可得知 402C17
函数参数的个数(因使用的是stdcall调用方式,所以栈由被调用者负责清理)
调用之前的地址 19fab8
调用之后的地址 19fab4
相差4
首先先定位到注册码判断的命令位置处
字符串找关键字符
跳转过去,往上找判断语句
这里发现调用了 __vbaStrCmp
函数。 __vbaStrCmp
API是VB中用于比较字符串的函数。这里大概率就是与上面压入栈中的参数 I'mlena151
进行比较
我们输入进行验证
成功了