第一期 03 壳内寻找注册码

我们先把课程的软件安装

打开软件, 软件标题显示 未购买用户, 我们等会就从这个字符串入手

我们点击 购买, 然后随便输入一些 1111111, 然后 注册验证, 它提示我们重启程序, 很明显这个是一个重启验证系统, 就是你虽然注册了, 但它要重启验证一下你是不是已经注册了

重启之后, 还是 未购买用户, 点击 购买 之后界面还是那样的, 没有任何变动, 这说明程序在重启的过程中提取了我们输入的东西, 并进行判断, 结果为假

我们大概知道了程序的流程, 现在我们可以开始搞事了

先查壳, 是 ASpack 壳, 我们这次不脱壳来实现破解

OD 载入

F9 运行, 然后 Ctrl+G 输入 401000

不是说所有带壳程序都能到 401000 就解码了, 因为有的程序的代码段不是 401000, 那么怎么区分呢 ? 这个我们以后再说.

然后我们搜索字符串, Ctrl+F 搜索 未购买用户, 跟进去看看

我们向上拉看有没有什么跳转之类的东西

我们找到了一个注册表项, 程序肯定是在启动的时候访问了注册表, 提取了我们输入的用户名和假的密码, 然后判断出来是错误的, 所以我们刚才注册失败了

我们在这里下个断点

重新载入, OD 显示损坏断点, 我们不管它

我们点 插件 > API断点设置工具 > 常用断点设置 > 常用断点 > GetStartupInfoA 获取启动信息

这个 API 断点就是在程序初始化之前将其断掉, 因为这个程序有壳, 我们就利用这点, 在它已经解码但是没有运行起来的时候, 也就是在程序提取用户名与假密码之前断下来.

我们 F9 运行, 右下角堆栈窗口显示了程序调用 API 的函数, 有时候你可能需要多次 F9 才能显示这个, 如何判断呢 ? Alt+B 查看断点, 刚才我们 F9 初始化断点已经把程序断下来了, 我们看注册表项的那个断点, 前面的反汇编显示 mov edx,engydt.004BCA40, 而不是 add byte xxxx, 这说明程序已经解码了.

这个断点被禁用了是因为刚才的提示, 我们把这个断点激活, 然后我们判断程序已经解码了, 所以我们没必要保留这个 API 断点了, 把 API 断点禁用.

我们 F9 运行, 程序成功断在了注册表那个代码那里, 我们 F8 单步跟踪, 看看程序做了些什么, 注意右侧寄存器窗口, 你可以看到程序提取了我们输入的假密码, 但是由于我刚才什么也没输所以这里没显示.

继续单步跟踪, 发现出现了一堆可疑的字符串, 不是我们输入的那种, 我们把它复制下来 :

0012FDCC 00B3CCF4 ASCII "BA9676569DB06ACC040A443B72888BD2040A443B72888BD200AADB6926A6FCAF"

继续 F8, 发现程序在对比我们的假码是不是与真码相同

然后由于我们的假密码与真密码不一样, 所以下面的越过 未购买用户jnz 跳转失效了

由于带壳程序不能爆破保存, 只能打补丁, 我们以后会讲到打补丁, 我们已经找到注册码了, 所以这节课的工作已经大功告成~

---------------------

接下来我们试试脱壳爆破, 由于我们已经注册, 所以我们需要先卸载重装才能看我们是否爆破成功

emmm程序改了注册表, 我们需要改一下注册表才能测试能否爆破, 这个壳倒是很好脱, 不过我不想折腾注册表, 所以就这样吧.