不脱壳直接从内存中找出软件注册码。
这个软件是通过重启来进行验证的。第一次输入注册码后会让重启软件去验证注册码。
破解过程
- 输入假码
把自己编的用户名和假的注册码(假码)输入进去。假码不要弄的太随机了,否则在内存中看到后不知道是自己输入的假码。在视频中,作者用的一串 1 作为假码。 - 重启软件
这时,软件肯定是显示未注册的。 - 把软件载入OD调试
软件停在了地址: 0X567001。
作者让按“Ctrl+G"跳转到 401000。没有过多解释,只是说程序已经运行起来了,把壳运行完了。
这时,可能会遇到OD提示是否分析,直接点“否”就可以了。如果不小心点了“是”,可以在OD的CPU窗口中右键——分析——删除分析。
就当自己是零基础了。别问问什么作者这样做,先把问题给记下来。 - 搜字符串
“智能搜索”字符串,按Ctrl+F找到“未购买”,看看它在哪里被用过,双击跳转过去。 - 寻找线索
到了那里后,往上寻找有没有一个跳转会跳到这里。在上翻的过程中,看到了一段代码引用了字符串“Software\engydat”。作者断定这是访问了注册表的证据。由于软件是重启验证的,故一定有一种机制来保存输入的注册码的,而注册表是一个很好的地方。
作者在这里下了一个断点。自己的感想
为何选择在这里下断点呢?因为软件读取注册表里的注册码后,会和真码进行比较,断在这里,然后进行单步调试,就可以找到真码了。 - 再下API断点
使用OD的“API断点设置工具”在GetStartupInfoA出下了断点。作者的解释是:软件在运行完壳代码把程序脱壳后,会使用到这个API,但是此时并未对注册码进行验证。自己的感想
为何要在这个API下断点?我的理解是由于加了壳,所以步骤5中断点是不能用的,只得在软件脱壳后且未验证之前再下一个断点,让我们有时间来手动激活步骤5中的断点。 - 在OD中重新载入软件
断在了GetStartupInfoA那里,这时是位于kernel32。
查看“断点”窗口,在步骤5中下的断点会被OD禁用。那里的内容还是未解码的,所以多试几次F9,知道那里出现汇编代码。我的感想
多试几次,多断在GetStartupInfoA那里确实有必要。我在试验时就是一次F9不行,试了2次才可以的。 - 禁用API断点
把步骤6中下的API断点禁用掉,步骤5中的断点激活,再次F9运行,这很快就会断下来。 - 找到真码
随后一路F8,注意堆栈窗口中出现输入的假码。
还会出现几个类似注册码的,都复制下来,并一一验证,看看哪个是真码。
一路F8会到一个jnz,它控制着是否进入“为购买用户”那里,这就是一个关键跳。 - 输入真码
关闭OD,重启软件。试验找到的“乱码”,其中一个就是真码。注意:用户名也应该是步骤1中输入过的。
网友评论