11.视频讲座

一位名叫Lena的人在 http://www.tuts4you.com/ 公示板上贴了40个crackme讲座,以帮助初学者学习代码逆向分析技术。这些讲座非常受欢迎,因为所有讲座都以Flash视频形式呈现出来,且让学习者感到非常亲切。各位可以链接到tuts4you网站观看这些视频讲座,这对学习代码逆向分析技术非常有帮助。

1. 运行

运行要破解的程序 给我们了两条信息
Pasted image 20250312185009
就是说叫我们 去除提示框 并找到正确的注册码

2. 分析

2.1. 去除消息框

打开后发现也是用VB编写的软件,因为我们在EP中发现了 ThunRTMain
Pasted image 20250312185606

而且我们知道VB中调用消息框的函数是 rtcMsgBox
然后我们在调用模块中去查找,可以发现有三次调用此函数
Pasted image 20250312190237
在每一处调用都设置一个断点
Pasted image 20250312190333
然后运行程序
发现程序在 402CFE 处断了下来,此时应该就是要调用函数进行显示消息了。那么上面多半就有要显示的消息。果不其然,上面确实可以发现将要显示的消息
Pasted image 20250312190608

然后我们继续运行,我们找一下程序中点击 nag? 按钮后的断点在哪里
发现还是断在了 402CFE 处。那么我们只要对这一处进行修复即可
Pasted image 20250312190941

2.2. 打补丁去除消息框

2.2.1. 第一次尝试

我们先修改 402CFE 处的call命令
原来的
Pasted image 20250312191210
修改后的
Pasted image 20250312191249
402CFE 地址处的ADD ESP,14命令的含义是,按照传递给rtcMsgBox参数的大小(14)清理栈。并用NOP填充其余2个字节,以保证代码不会乱(原来CALL命令的大小为5字节,ADD命令用3个字节,还余下2个字节)。
看上去没有什么问题,但结果却“发生错误”。原因在于没有正确处理 rtcMsgBox 函数的返回值(EAX寄存器)。

如图,在 402CFE 地址处调用 rtcMsgBox 函数后,402D0C 地址处将返回值(EAX)存储到特定变量(EBP-9C)。此处消息框的返回值应该是1(表示“确定”按钮)。若存储的为1之外的值,则表示程序终止。那么最好试试其他方法。
Pasted image 20250312191746

(1)可以修改402CFE地址处的指令,如下所示。
ADD ESP,14 (Instruction:83C414)
MOV EAX,1 (Instruction:B801000000)

以上两行汇编代码产生的结果与调用 rtcMsgBox 函数后用户按“确定”按钮的结果相同(栈与返回值相同)。之所以没有这样做是因为指令长度不合适源文件 402CFE 地址处的命令长度为5字节,但上面2行汇编命令的长度为8个字节,因此会侵占到后面的代码

(2)x86(IA-32)系统中使用EAX寄存器传递函数的返回值。

2.2.2. 第二次尝试

在断点处向上看可以发现 402C17 处表示函数开始的栈帧
Pasted image 20250312192122
402CFErtcMsgBox 函数调用代码也是属于其他函数内部的代码。所以如果上层函数无法调用,或直接返回,最终将不会调用 rtcMsgBox 函数。像下面这样修改401C17处的指令(使用AssembleSpace指令)。
原来的
Pasted image 20250312192226
修改后
Pasted image 20250312192322

要根据传递给函数的参数大小跳转栈 (RETN XX)

然后运行 发现就去除了消息框

2.2.3. 如何查看401C17 函数的参数个数

首先找到 402C17 处函数的返回地址,在 402C17 下个断点,并运行到这里
Pasted image 20250312195055
然后可以在栈空间看到返回的地址是 7401E5A9
goto过去看返回地址上一条命令。即执行此命令后就完成 402C17 函数。并返回地址到 7401E5A9
Pasted image 20250312195415
如图所示 返回地址 (7401E5A9)。该代码区域是 MSVBVM50.dll 模块区域。执行 7401E5A7 地址处的 CALL EAX 指令后即返回 7401E5A9 地址处。再次运行调试器(Ctrl+F2),在 7401E5A7 地址处设置断点后运行程序(F9),可以得知EAX的值为402656
Pasted image 20250312195550

此时会进入一个函数内部,并跳转到 402656 地址处,
Pasted image 20250312195843
然后我们使用 ctrl+f9 发现最后会回到 402C17 地址处
所以调用 call eax 就是在调用 402c17 地址处的函数,那么我们只要确认 CALL EAX 命令(7401E5A7)调用前后的栈地址即可得知 402C17 函数参数的个数(因使用的是stdcall调用方式,所以栈由被调用者负责清理)

调用之前的地址 19fab8
Pasted image 20250312200339
调用之后的地址 19fab4
Pasted image 20250312200433
相差4

2.3. 查找注册码

首先先定位到注册码判断的命令位置处
字符串找关键字符
Pasted image 20250312200613
跳转过去,往上找判断语句
Pasted image 20250312200804
这里发现调用了 __vbaStrCmp 函数。 __vbaStrCmp API是VB中用于比较字符串的函数。这里大概率就是与上面压入栈中的参数 I'mlena151 进行比较
我们输入进行验证
Pasted image 20250312201027
成功了