OD 实验(十一)

程序:

点击安装程序

这是一个拼图程序

点击 Options -> Flash Sizes

程序会提示是未注册版本

点击一些选项的时候会提示该程序只给注册的用户

点击 Register

随便输入一个密码,然后点击 OK

密码错误

用 PEiD 看一下该程序使用的是什么编译器

Microsoft Visual C++ 7.0

逆向:

用 OD 打开程序

首先先查找一下关键字

右键 -> 查找 -> 所有参考文本字串

拉到最顶端,右键 -> 查找文本

双击跟进该字符串所在的地方

这里有个 je 跳转指令,如果跳转实现的话就会显示 unregistered

那就让 je 不实现跳转

那 je 跳转指令改为 nop

保存程序

运行程序

点击 Options -> Flash Sizes,没有再显示 unregistered

但是点击其它选项还是会弹出提示框

继续看一下程序

je 跳转指令上的 mov 指令把 esp+0x4 处的值赋给 al

在 mov 指令处下一个断点,重新跑一下程序

esp+0x4 的地址为 0012E19C,值为 0,所以 al 的值也为 0

上图所示,mov 指令本地调用来自 004047D3 和 00404880,跟上去看看

右键

先跟 004047D3

下一个断点

按 Enter 键回到 mov 指令处

接下来跟 00404880

在此处也下一个断点

重新载入程序跑一下

程序先停在该处

可以把 00404880 的断点删除

按 Alt+B 查看断点,按 Delete 进行删除

因为 004047D3 处的 call 指令先对 mov 指令进行操作

上面有个 push 指令

push 指令把 eax 推入栈中

而 0012E19C 决定了 al 的值

所以此处的 eax 决定 0012E19C,0012E19C 决定 al

而 eax 的值取决于它上面的那条 call 指令

因为函数的返回值存放在 eax 中

在此处的 call 指令处下一个断点

重新跑一下程序

按 F7 步入该 call 指令,看看该 call 指令任何返回 eax 的值

按 F8 往下走

这里有个循环,每执行一次循环

EAX 上的 ASCII 值就会少一个字符

当字符全减完之后,它就会往下走

此时寄存器 eax 的值为 9

因为 <No Pass> 为 9 个字符

cmp 指令把密码位数和 4 进行比较

如果密码位数大于 4 的话,将执行 jnb 跳转

如果密码位数小于 4 的话,执行 xor 指令,把 al 的值变为 0

先跟着 jnb 跳转看看情况

这里有个 call 指令,它有 3 个参数,分别是 push 的那三个参数

步过 call 指令继续往下走

test 指令比较 eax 的值,如果 eax 的值不为 0 的话,将执行 jnz 跳转;如果 eax 的值为 0 的话,将不执行 jnz 跳转

跳转将跳到 xor 指令处

xor 指令将 al 清 0,pop 将 esi 出栈,然后返回,al 部分为 0,程序还是会提示注册不成功

所以改一下 xor 指令就好了

保存文件,运行一下

被限制的功能都能用了

原文地址:https://www.cnblogs.com/sch01ar/p/9668403.html