我们先把课程的软件安装
打开软件, 软件标题显示 未购买用户
, 我们等会就从这个字符串入手

我们点击 购买
, 然后随便输入一些 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程序改了注册表, 我们需要改一下注册表才能测试能否爆破, 这个壳倒是很好脱, 不过我不想折腾注册表, 所以就这样吧.