逆向学习(六):OD逆向之高级方法进阶

爆破,是最初级的破解方法,不到万不得已不要直接修改JNZ等跳转命令进行通关。应当理解程序背后的逻辑、走法,体会真正的逆向。

一、初次调试

使用od加载软件 -> F9运行 -> 点about -> 点Register -> 输入邮箱和密码 -> Register Now -> 弹出错误提示框 -> 记住提示框的内容。如下图:

二、寻找字符串

重新加载软件,通过中文搜索引擎查找字符串“you han entered an”,通过“查找下一条”看是否有其他相同字符串,发现只有一条,然后双击,跳转到字符串汇编命令所在位置。

三、推理程序逻辑

1、向上看到一个jnz跳转命令,如果跳转实现就不会弹出刚才的窗口,由此看出是一个关键跳转。

jnz跳转条件:ZF = 0
jz跳转条件:ZF = 1

2、我们在向上查找引起跳转判断的条件,即发现是test命令,

test命令解释:
该指令和and一样,即对两个操作数进行按位的‘与’运算,唯一不同之处是不将‘与’的结果保存到dest。即本指令对两个操作数的内容不进行修改,仅是在逻辑与操作后,对标志位重新置位。
test结果为0,则ZF=1;test结果为1,则ZF=0。

3、可以得出结论:

  • al=0 -> test=0 -> zf=1 -> jnz不跳转 -> 未注册;
  • al=1 -> test=1 -> zf=0 -> jnz跳转 -> 注册。
  • 因此,我们要想注册成功,让al=1即可。

4、接着,我们要找到决定al值得位置,向上可以看到有一个调用函数的call,因此该call会影响al的值。因为函数的返回值都是保存在eax寄存器中,al是eax的最低位(最后一个字节00)。

5、在该call的位置F2下断点,重新加载并运行程序,再次重复注册流程,接着程序来到断点处。

6、f7进入call,进入后不要急着往下走,先观察。发现有两个call,下面都有test al,al,因此第一个call是必须要进入的,第二个call要看jnz是否实现跳转。我们直接f8往下走,发现jnz未实现跳转,因此也需要进入第二个call。我们在两个call处下F2断点。

7、继续f8往下走,经过跳转,又看到一个call。不过我们发现,eax值变成了一个地址004B3803,再F8到sub esp,0,发现eax值又变成了00407073。也就是说这个eax和注册与否无关,这个call也不需要进入。

我们继续F8往下走,没有看到有al,以及关键的call,知道retn返回,跳出了这个函数,回到原来的位置。

8、重新加载软件,F9运行,打开软件后重复注册流程,接着程序来到第一个断点call处,F7进入,F8往下走,来到断点处F7进入,在选中行和下一个retn中间,我们看到两个有al的位置,分别是mov bl,almov al,bl,它们上面分别有call,我们先不用去管。在之前,我们注意到,只要al=1就可以实现成功注册,我们尝试将第二个mov改为mov al,1,接着F8往下走,到最后就弹出注册成功的窗口了。

9、保存文件后,打开逆向后的文件,就没有未注册提示了。End!

评论

Your email address will not be published. Required fields are marked *

Scroll Up