(reversingwithlena)Lena crackme tutorial 10笔记

相关链接:

跳过之前几篇教程的原因是个人认为 Lena 的教程是一步一步的教学,在调试的时候遇到无法解决的疑问可以去细看,否则没有太大必要。直接跳到 10 的一个重要原因是这是《逆向工程核心原理》第 11 章的内容

一、目标

  1. 删除所有烦人的 Nags (唠叨)
  2. 查找 registration code (注册码)

二、运行

打开后弹出“Nag Screen”窗口,点击取消退出程序;

点击确定后:

点击“Nag?”弹出“Nag Screen”窗口;

在“Regcode”中随意输入:

三、删除所有 Nags

1、找到 Nags

我们先用 Ollydbg 打开,然后看一看附近的指令

一眼看出这是 VB 代码。这些应该都是启动函数

从头一步步调试肯定不现实,所以分析我们要找的东西——“Nag Screen”窗口

VB中生成窗口的函数名是 rtcMsgBox()

通过右键->查找->所有模块间的调用,找到 4 个 rtcMsgBox()。

这四个都有可能是“Nag Screen”,怎么办呢?

设置断点,之后一个个跟踪(右键->在每个 rtcMsgBox 上设置断点)

设置完断点后 F9 执行到第一个断点,向上查看指令

看到字串“Nag Screen”,看起来这个就是我们想要找的 Nags

2、去除 Nags

怎么删除呢,书上介绍了两种方法

1.修改 CALL 命令

将 00402CFE 的 CALL命令修改为 ADD ESP, 14

这一步的含义是,按照传递给 rtcMsgBox() 参数大小(14)清理栈。并用 NOP 填充其余 2 个字节,以保证代码不会乱(原来 CALL 命令的大小为 5 字节,ADD 用 3 个字节,还余下 2 个字节)

看上去没什么问题,但结果却“发生错误”。原因在于没有正确处理 rtcMsgBox() 函数的返回值(EAX寄存器)

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

之所以没有在 ADD ESP,14 后加上 MOV EAX,1 的原因是源文件 402CFE 地址处的命令长度为 5 字节,但上面 2 行汇编命令的长度为 8 个字节,因此会侵占到后面的代码。

2.修改使程序不执行这段代码,直接返回

往上拖动滚动条,寻找这段代码的起始——表示函数开始的栈帧 prologue

即寻找 PUSH EBP ; MOV EBP,ESP

bingo! 找到

402CFE 的 rtcMsgBox 函数调用代码也是属于其他函数内部的代码,所以如果上层函数无法调用,或直接返回,最终将不会调用 rtcMsgBox 函数。因此我们修改调用 rtcMsgBox 的这个函数。

将 00402BB3 处的命令修改为 RETN XX(未知) ;直接返回


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

那么怎么查看 402C17 函数的参数个数?

1、确认 402C17 函数的起始代码存储在栈中的返回地址

在 402C17 设置断点,然后重新打开,运行到断点处,此时右下角栈窗口中存储着返回地址——7401E5A9

进入返回地址(7401E5A9)。该代码区域是 MSVBVM50.dll 模块的区域。执行 7401E5A7 地址处的 CALL EAX 指令后返回 7401E5A9 地址处。再次运行调试器,在 7401E5A7 地址处设置断点后运行程序,可以得知 EAX 的值为 402656

转到 402656 地址处,最终跳转到 402C17 地址

综合考察可以发现,7401E5A7 地址的 CALL EAX 命令最终调用的是 402C17 地址处的函数。所以,确认 CALL EAX 命令调用前后的栈地址可得知 402C17 函数参数的个数(因使用的是 stdcall 调用方式,所以栈由被调用者负责清理)


调用 CALL EAX 前
调用 CALL EAX 后

可以看到两者相差 4 位。因此前面的 RETN XX 应为 RETN 4


现在回到 402C17 地址处,将其修改为 RETN 4

选中修改,右键->复制到可执行文件->选择->右键->保存文件->保存

打开刚刚保存的程序

这次没有跳出 Nags 了,点击 Nag? 也没有反应。说明我们成功了

3、查找注册码

先输入任意值试试

弹出对话框显示,输入的是错误的注册码。在 Ollydbg 中检索错误消息字符串(右键->查找->所有参考文本字串)

搜索“RegCode is wrong!”,如果第一个不是则点击查找下一个

找到后双击跟随

我们知道一定有个条件会使程序进行到这里,所以不妨往上找找

找到了 Goodboy ,在往上看到了一个字串“I’mlena151”

这个字串后面是 _vbaStrCmp ,一看就知道这是一个比较字符串的函数

之后有一条 je 跳转命令跳过 goodboy,因此我们可以基本确认这个字串就是我们要找的 RegCode ,输入“I’mlena151”

成功!

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒