OD调试9—实例:深入分析代码完成软件破解
爆破,是最初级的解决方案,不到万不得已,我们不直接修改JNZ通关。因为这样子的话,我们就享受不到破解、逆向的真正乐趣了。
了解程序背后按照剧情发展经常会出的一些走法,逆向程序的算法,才能体会逆向的真正乐趣!
所以,今天的主题是:是男人,就跟进去吧~
这次还是使用一个比较简单的程序,不然太复杂的话,一步步跟进程序可能会把自己搞崩溃,脑子恐怕不够搞。大家凭自己的能力,能进入多少就进入多少,一分不少,一寸不多!能力是培养出来的,耐心!
试验软件:MrBills.exe(一个扫描仪软件)
软件下载链接:http://pan.baidu.com/s/1hq7rKpu
运行起来看看:
记住这句注册失败的提示信息。因为它可以作为一个关键的字符串来寻找。
未注册版的软件一般会限制功能,注册完成后才让你使用所有功能。
用OD打开这个可执行文件,开始分析:
1 查找字符串:
Cpu窗口右键->查找所有参考文本字符串->查找注册失败的提示信息”You have entered an xxxxxx” (注意把进度条拉至文本子串最上方,因为它是从上往下查找的)
查找结果如下图:
双击该字串,跟随到cpu窗口代码处。
在这里我们找到了上方一个突破口—跳转jnz,这里如果jnz跳转的话,就直接来到了注册成功处:”Thank you for registering!”,所以它是一个关键跳转。
2 分析:
(1)那么跳转jnz的条件判断是由谁引起的呢?
是在它上方的test al , al。因为这句会改变寄存器里标志位ZF的值(0或1)。
test进行的是逻辑与运算(and),如果两个al为1的话,结果为1;两个为0的话,结果为0。它不改变al的值,只会修改标志位。
此时通过eax寄存器可以看出al为0,所以ZF标志位为1,(运算结果为0时,标志位Z置1),进而jnz不会跳转,即来到注册失败处。
由此我们就可以推理出,想办法把al的值由0变为1,就可以实现关键跳转,进而使软件注册成功了!!
(2)那么al的值在哪里被修改过呢?或者说是谁决定了al的值呢?
可以看到在test语句上方有一个call,我们在win32汇编语言里学过:Call调用函数进行一堆操作之后的返回值都存放在EAX里,也就是说这个call会影响到al的值。(al是eax的最低位/最后一个字节,eax是32位的,al是8位)
那么这个call就是需要进入分析的,在该处下断点,重载后写入注册信息触发该断点,接着进入这个call里,来到下图:
进入之后呢,不要盲目地按F8过,先观察下程序内容(很多朋友就一直F8走,寄存器也不看,下面地址也不看,进行了什么样的逻辑关系也不看,就是直接的走,然后就迷路了!)
观察之后,我们发觉,又出现了两个相连call和test(如上图),这两个call也会影响到我们关注的al的值,所以注释上【需进入】,方便之后进入分析。下面进入第二个call里,如下图:
进入第二个call里,发现了两个关于al的可疑之处(如上图),mov bl,al mov al,bl 这两句是干啥呢?将al的值给bl,bl的值再还给al….??现在可以推想一下: bl可能是用来暂时保存数据的,al标志着是否已经被注册,它不希望被修改,所以将al保存在bl里面,经过一些操作后,再将bl赋给al。那么在这之前,决定al值得call或许就是一个关键点!我们接着进入上图中的第4个call,如下图:
在这里走过一遍,发现al的值在这里被bl赋为0,这里就是修改的关键点了,将这个al的值修改为1的话,就应该注册成功了,我们先走出去,稍后再来一轮在这里进行修改。
F8走出这里后回到第二个关键call的位置,如下图:
继续往下走,我们要绕出去!
好了,进到几个关键call里用火眼金睛巡视了一番后,终于找到了注册的关键所在,只要把第4个关键call里的al的值修改为1(原来为0),就应该可以注册成功了!
修改如下:
修改后点击运行:成功注册了了!!
点击确定,软件变为了已注册版: