OllyDebug-带壳破解某软件-获取注册码

首先使用查壳软件PEiD v0.98,查看下我们要破解的软件是否加壳了:

可以看到软件使用ASPack 2.12进行了加壳,本次我们暂时不进行脱壳,直接破解,获取软件的注册码,注意加壳的软件修改之后是不能保存的,只能通过脱壳之后在保存,或者是使用打补丁的方式。
运行软件:

软件标题栏提示为购买用户,点击购买,输入用户名和注册码:lzx,1111111111111111111111,然后点击注册验证,软件提示重启软件进行验证。

能够得出的结论是,这是一款重启验证软件,本次我们输入用户名和注册码之后,软件会先将这两个参数存储,在软件重启的时候,会读取这两个值,进行验证。注意,这两个值可能存在软件安装目录的文件夹下,或者是被写入到注册表中。然后点击确定,软件退出。
使用OD载入软件,提示软件代码段可能被压缩,证明软件被加了壳:

点击确定或者取消进入OD,接着,F9运行软件,然后Ctrl+G,跟随表达式到“0X00401000”处:


在上图中,反汇编窗口处,右键->分析->从模块中删除分析:


(注意:本步骤中,之所以需要先运行程序,是因为程序加了壳,首先运行程序,程序或先将压缩壳脱去,如果不先运行程序,直接Ctrl+G跟随的话,代码还有脱去压缩壳)
(注意:不是所有的程序都是在0X401000处,但是大多数程序的入口段都是在这个位置,除非开发人员特意修改)
到上图所示的界面,基本上就能判断程序已经加压缩了,脱去了壳。
脱去壳之后,就来到了代码段,选择搜索字符串,智能搜索,关键字:未购买

双击未购买用户,转入反汇编窗口,查找代码上文的内容,看没有关键跳和关键CALL,很巧,找到一个读取注册表的代码:

在注册表出下断点,初步判断软件在重启的时候,在这个代码处读取注册表中的数据,也就是用户输入的用户名和注册码。下断点之后,重新载入程序,程序会提示断点丢失,这是因为程序加了壳的缘故,不要紧,断点在B标签中能够查看到。

然后设置API断点,菜单栏->插件->API断点设置工具->常用断点设置:

这个断点会在程序解码之后,但是还没有运行起来的时候中断。这个时候程序还没有进行注册码的判断,所以在这个时候设置断点。然后F9运行程序,程序在断点处停下:

切换到断点窗口:

将之前的读取注册表的断点激活,禁止掉初始化的断点。
然后F9运行程序,程序停在了读取注册表的地方:

然后我们单步执行F8,注意观察CPU寄存器和堆栈窗口中的数据,能够看到读取的我们之前填入的用户名和注册码,以及软件根据我们用户名生成的正确的注册码:


继续向下执行:

这个注册码就是对应我们用户名正确的注册码了,记录下来,等会进入软件进行注册。
程序后面就是进行注册码的对比了,会有关键CALL和关键跳,但是程序加了壳,我们无法保存修改,所以暂时不用这种方法,(加壳程序可以通过打补丁的方式爆破),我们使用正确的注册码使用软件。
关闭OD,使用之前的用户名和现在正确的注册码进行注册:

总结:
1.很多软件都会加壳,使用PEiD v0.98进行查壳;
2.软件未脱壳的情况下,需要先F9运行软件之后,才能做后面的操作;
3.很多软件都使用重启验证的方式,这些信息一般会存在软件的安装目录的配置文件中或者是注册表中;
4.找到读取注册表或者配置文件的代码段,单步执行,注意观察CPU寄存器窗口和堆栈窗口,软件会根据用户名生成正确的注册码,注意多单步运行几次,记录下所有敏感的字符串。