逆向学习(八):OD逆向之算法初试

之前的学习过程,大多数情况都是通过查找字符串,然后修改跳转命令实现简单爆破。但实现的可能仅仅是在窗口上不显示“unregistered”等字样,并未完全完全实现爆破。想要完全实现爆破,就需要找到算法思路。
本次学习,小试牛刀,寻找软件的算法过程和思路。

一、初次运行

打开软件,是未注册状态,窗口标题有unregistered标识。

二、开始调试

1、OD加载程序,通过中文搜索引擎,查找“unregistered”字符串,发现只有一个,双击进入字符串所在命令。在命令上面发现一个je跳转,跳转实现意味着未注册,跳转未实现代表已注册。

2、此时,不能像往常一样直接nop掉跳转命令,因为这只是修改了窗口标题,功能还是未实现。

3、实现跳转的条件就是上面的mov al,byte ptr ss:[esp+0x4]test al,al,即esp+0x4的值赋给al,然后进行test操作,对标志位进行操作,进而决定跳转是否实现。

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

因此,我们可以得知:esp+0x4=0 -> al=0 -> test=0 -> ZF=1 -> je跳转 -> 未注册。

4、我们在mov命令处F2下断点,并且发现“本地调用来自 004047D3, 00404880”,因此我们要在004047D3, 00404880两个地方下断点,因为该处决定了esp+0x4地址的值。
鼠标右击“本地调用来自 004047D3, 00404880”,分别选择“转到CALL来自004047D3”、“转到CALL来自00404880”,跳转到两个call处进行断点。(小技巧:当转到一个call时,按回车键就会跳回原mov处。)

5、重新加载并运行程序,程序在004047D3停下,我们就可以把00404880处的断点去掉了,因为程序自启动以来,第一个判定是否已注册的地方就是004047D3,其他地方已经不重要。

6、在004047D3上方有一个push eax,意思是将eax的数据推到栈里面,通过右下角的栈区可以看到是将eax的值推到了12e19c
这个地址,该地址也是上面的esp+0x4

因此,得出结论:eax的值决定esp+0x4地址中的数据。

7、在push eax处上有一个call,也就意味着这个call的返回值会影响eax,也就是会影响验证的成功与否。我们在这个call下断点。

8、重新载入并运行程序,程序在刚才的断点处停下,F7进入call。该函数时注册码的算法过程,有两个retn返回处,一个是验证正确,一个是验证失败。我们先不管具体的算法,先一直F8向下走,来到其中一个上有xor al,al的retn处,此时的eax=FFFFFF00,此处是算法验证失败的返回处,xor指令是将al清零,此时我们将该指令改为mov al,1即可,eax变为FFFFFF01。保存后再打开软件,就没有unregistered提示了,相关功能也可以正常使用。

评论

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

Scroll Up