在OD(OllyDbg)中,爆破是最初级的解决方案,不到万不得已,我们不直接修改JNZ通关。因为这样操作的话,我们就享受不到破解、逆向的真正乐趣了。了解程序背后按照剧情发展经常会出的一些走法,逆向程序的算法,才能体会逆向的真正乐趣!为了更好地模仿破解场景,这里使用一个比较有代表的程序。通过一步一步的测试,锻炼测试者的耐心!
试验软件:MrBills.exe(扫描仪软件)。
查找提示信息
首先,运行软件,界面如图1所示。
图1
记住这句注册失败的提示信息,因为它可以作为一个关键的字符串来寻找。未注册版的软件一般会限制功能,注册完成后才让你使用所有功能。用OD打开这个可执行文件,开始分析。
查找字符串
在CPU窗口中单击右键,选择“查找所有参考文本字符串”,在查找注册失败的提示信息提示中,输入“Youhaveenteredanxxxxxx”(注意把进度条拉至文本子串最上方,因为它是从上往下查找的)。查找结果如图2所示。
图2
双击该字串,跟随到CPU窗口代码处,如图3所示。
图3
在这里我们找到了上方一个突破口:跳转jnz,这里如果jnz跳转的话,就直接来到了注册成功处:”Thankyouforregistering!”,所以它是一个关键跳转,如图4所示。
图4
火眼金睛:分析关键节点信息下面,进行几个关键信息分析。
第一,跳转jnz的条件判断是由谁引起的呢?
仔细分析后,我们发现,是在它上方的testal,al。因为这句会改变寄存器里标志位ZF的值(0或1)。
test进行的是逻辑与运算(and),如果两个al为1的话,结果为1;两个为0的话,结果为0。它不改变al的值,只会修改标志位。
此时,通过eax寄存器可以看出al为0,所以ZF标志位为1,(运算结果为0时,标志位Z置1),进而jnz不会跳转,即来到注册失败处。由此,我们就可以推理出,想办法把al的值由0变为1,就可以实现关键跳转,进而使软件注册成功了!!
第二,al的值在哪里被修改过呢?或者说是谁决定了al的值呢?
可以看到在test语句上方有一个call,我们在win32汇编语言里学过:call调用函数进行一堆操作之后的返回值都存放在EAX里,也就是说这个call会影响到al的值。(al是eax的最低位/最后一个字节,eax是32位的,al是8位)那么这个call就是需要进入分析的,在该处下断点,重载后写入注册信息触发该断点,接着进入这个call里。如图5所示。
图5
进入之后呢,不要盲目地按F8过,先观察下程序内容(很多朋友就一直F8走,寄存器也不看,下面地址也不看,进行了什么样的逻辑关系也不看,就是直接的走,然后就迷路了!)
观察之后,我们发现,又出现了两个相连call和test,这两个call也会影响到我们关注的al的值,所以注释上【需进入】,方便之后进入分析。下面进入第二个call里,如图6所示。
图6
进入第二个call里,发现了两个关于al的可疑之处(如上图),movbl,almoval,bl这两句是干啥呢?将al的值给bl,bl的值再还给al….??现在可以推想一下:bl可能是用来暂时保存数据的,al标志着是否已经被注册,它不希望被修改,所以将al保存在bl里面,经过一些操作后,再将bl赋给al。那么在这之前,决定al值得call或许就是一个关键点!我们接着进入上图中的第4个call,如图7所示。
图7
继续查找,可以看到如图8所示的数值。
图8
在这里走过一遍,发现al的值在这里被bl赋为0,这里就是修改的关键点了,将这个al的值修改为1的话,就应该注册成功了,我们先走出去,稍后再来一轮在这里进行修改。
F8走出这里后回到第二个关键call的位置,如图9所示。继续往下走,我们要绕出去!如图10所示。
图10
好了,进到几个关键call里用火眼金睛巡视了一番后,终于找到了注册的关键所在,只要把第4个关键call里的al的值修改为1(原来为0),就应该可以注册成功了!修改如图11所示。
图11
修改后点击运行:成功注册了了!!然后点击“确定“按钮,软件变为了已注册版,如图12所示。
图12
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。