逆向学习(五):OD逆向之高级方法初试

一般情况下,我们在给软件打补丁时,会在OD中修改跳转命令,或nop掉相关命令等方法实现破解,该方法适合操作小软件。假如我们需要爆破的是一款大型软件,里面有几十甚至更多的命令需要修改,如果一个一个地修改跳转,工作量巨大。本次课程,我们通过修改关键位置相关的传值参数实现爆破。

一、初次调试

我们本次爆破的软件,开始会弹出一个NAG窗口,一般是在软件未注册时弹出。因此,我们可以将该窗口作为切入点,因为找到nag窗口的触发点,就很大可能找到判断注册或未注册的跳转位置。如下图:

二、一般爆破法

先介绍之前学习的爆破方法

1、我们在窗口标题,以及about窗口中发现“unregistered”字样,我们以此为切入点,通过OD中文搜索引擎查找该字符创。如下图:

2、我们双击寻找到的可能是窗口上的字符串,就来到汇编命令所在处,我们会发现命令上面有个关键跳转,在跳转处F2下断点。另外,应该养成一个良好习惯,因为这是一个函数,我们向上找函数的入口点,一般是“55”,我们也在此处下断点。

3、我们Ctrl+f2重新加载程序,然后F9运行程序。程序就会来到刚才的断点处,此时NAG窗口并没有弹出。
我们发现断点处的jnz跳转并未实现,我们就改成jmp实现无条件跳转。

4、我们再按F9继续运行程序,就会出现程序的主窗口,而没有nag窗口了。

5、我们再点help-about,OD就会跳转到另外一个“Unregistered”断点处,我们F8向下走,到jnz跳转命令处显示“未实现跳转”,我们通过汇编改成jmp跳转即可。此时,我们发现主窗口的标题,以及about窗口上面已经没有未注册标志。

6、总结:上述方法是对程序进行精简的爆破,很多大的程序还需要更多的类似操作。

二、高级爆破法

1、我们重新载入原始程序,还是寻找<unregistered位置,在上面的跳转及函数入口进行断点,在此不再赘述。

2、ctrl+f2重新载入程序,然后f9运行程序,来到第一个跳转断点处,此时的jnz跳转是未实现的。我们向上看有一个call命令,尝试在此下断点,重新载入并运行程序,程序在call断点处停下,通过F8向下走到jnz跳转处。

  • 通过mov命令,将60EB8C地址上的数据给了eax,60EB8C上的数据是610C4A地址;
  • 通过cmp命令,将610C4A上的数据和0对比,我们可以看到610C4A上的数据为0,所以cmp结果为0,则ZF标志位为1。
  • jnz判断标准是:zf=0则跳转。所以此处跳转无法实现。

3、此时,我们可以推断,60EB8C这个位置的数据与程序存放是否注册的点存在联系。
此时,我们选中5CC820这一行,接着右键鼠标-查找参考-地址常量,就会弹出窗口,程序中所有有关60EB8C的所有语句段都会列出,如下图:

4、此时,我们要找第一次初始化60EB8C的值的地方,因为该处就是判断是否注册的位置。右击鼠标 - 在每个指令上下断点。

5、重新载入并运行程序,可以看到来到了60EB8C位置,它的值还是610C4A。

6、通过解读该断点及以下命令看出:通过mov命令,将60EB8C的值(610C4A)传递给edx;接着再通过mov命令,将al的值填充edx上地址(610C4A)的值。

7、因此,我们修改al,就会修改610C4A的值,也就修改了60EB8C的数据。通过汇编,将al替换为1即可。

评论

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

Scroll Up