《第1期-03 壳内寻找注册码》学习笔记

不脱壳直接从内存中找出软件注册码。
这个软件是通过重启来进行验证的。第一次输入注册码后会让重启软件去验证注册码。

破解过程

  1. 输入假码
    把自己编的用户名和假的注册码(假码)输入进去。假码不要弄的太随机了,否则在内存中看到后不知道是自己输入的假码。在视频中,作者用的一串 1 作为假码。
  2. 重启软件
    这时,软件肯定是显示未注册的。
  3. 把软件载入OD调试
    软件停在了地址: 0X567001。
    作者让按“Ctrl+G"跳转到 401000。没有过多解释,只是说程序已经运行起来了,把壳运行完了。
    这时,可能会遇到OD提示是否分析,直接点“否”就可以了。如果不小心点了“是”,可以在OD的CPU窗口中右键——分析——删除分析。
    就当自己是零基础了。别问问什么作者这样做,先把问题给记下来。
  4. 搜字符串
    “智能搜索”字符串,按Ctrl+F找到“未购买”,看看它在哪里被用过,双击跳转过去。
  5. 寻找线索
    到了那里后,往上寻找有没有一个跳转会跳到这里。在上翻的过程中,看到了一段代码引用了字符串“Software\engydat”。作者断定这是访问了注册表的证据。由于软件是重启验证的,故一定有一种机制来保存输入的注册码的,而注册表是一个很好的地方。
    作者在这里下了一个断点。

    自己的感想
    为何选择在这里下断点呢?因为软件读取注册表里的注册码后,会和真码进行比较,断在这里,然后进行单步调试,就可以找到真码了。

  6. 再下API断点
    使用OD的“API断点设置工具”在GetStartupInfoA出下了断点。作者的解释是:软件在运行完壳代码把程序脱壳后,会使用到这个API,但是此时并未对注册码进行验证。

    自己的感想
    为何要在这个API下断点?我的理解是由于加了壳,所以步骤5中断点是不能用的,只得在软件脱壳后且未验证之前再下一个断点,让我们有时间来手动激活步骤5中的断点。

  7. 在OD中重新载入软件
    断在了GetStartupInfoA那里,这时是位于kernel32。
    查看“断点”窗口,在步骤5中下的断点会被OD禁用。那里的内容还是未解码的,所以多试几次F9,知道那里出现汇编代码。

    我的感想
    多试几次,多断在GetStartupInfoA那里确实有必要。我在试验时就是一次F9不行,试了2次才可以的。

  8. 禁用API断点
    步骤6中下的API断点禁用掉,步骤5中的断点激活,再次F9运行,这很快就会断下来。
  9. 找到真码
    随后一路F8,注意堆栈窗口中出现输入的假码。
    还会出现几个类似注册码的,都复制下来,并一一验证,看看哪个是真码。
    一路F8会到一个jnz,它控制着是否进入“为购买用户”那里,这就是一个关键跳。
  10. 输入真码
    关闭OD,重启软件。试验找到的“乱码”,其中一个就是真码。注意:用户名也应该是步骤1中输入过的。

你可能感兴趣的:(《第1期-03 壳内寻找注册码》学习笔记)