最近看《加密与解密》这本书,他的第一个例子是用查找字符串的方式完成的,但是现在很多软件无法用这种方法完成。作为一位菜鸟,想研究一下利用API断点的方式完成反编译。就用了这个最简单的序列号保护程序作为练手工具了。
首先打开Ollydbg打开要破解的软件,添加API断点。当然之前已经运行过软件了,大致知道弹窗类型,于是就很自然的选择了MessageBoxA()与MessageBoxW()(因为不知道字符类型嘛)。
然后运行,随意输入序列号,发现断点断到了这里:
好吧,这里应该就是传说中的MessageBox()了吧。现在沿着堆栈返回到Call这个函数的地方:
Ollydbg果然是个好东东,整个函数过程都标注出来了。现在继续往上面走,看看到底是哪个地方调用了这个函数。结果我往上面走遇到两个地方:
作为一名菜鸟,我在这两个地方耗费了好久的精力,结果毫无收获。其实这两个函数不是判断函数。我本能的感觉上面就是判断函数(好吧我每次写代码都是这么判断的)。但是其实不是。继续往上面看,有个setwindowpso().想来想去,这里可能还是为了初始化Messagebox()。其实后来我发现我也是逗了,因为抬头一看寄存器窗口,就有:
我靠,这里明显还有准备写入的"WrongXXX"什么的嘛。明显这里还是准备MessageBox()的地方。
好吧,现在继续往上走,彻底走出这个调用。
里有多个调用的地方,一个个试试,然后多下几个断点。看看是哪个地方调用的:
重新运行,发现断点断到了这里:
恩恩,这里好像是序列号程序自己的函数,可惜我功力尚欠,实在搞不懂为啥明明直接弹窗的地方特地有个Call- -。
沿着跳转向上,到了这里:
其实这里都可以看出来了,明显这里是多个判断的地方,出错弹窗。就在上面的地方断点,如果担心不行的话,就多设几个断点呗。但是这里就麻烦了,必须但不进入,嘿嘿。这种300KB的小程序还好,大程序就讨厌了。好吧,其实明显上面的那个是必须经过的,那么就是他了。于是,知道了用户名:
输入正确的用户名,再次运行,来到另一个认证密码的函数,得到
此时发现,咦咦咦咦咦咦!!!????怎么这么熟悉啊?这熟悉的味道,这熟悉的味道,这熟悉的声音,不就是
好吧,我思维定式了,总以为函数开始的时候是PUSH。如果按照书上的方法,直接一个参考字符串就解决了,我居然花了两天的时间。0.0
就当做积累经验了。。。。。。。