《第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中输入过的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,131评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,514评论 2 59
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,054评论 3 119
  • 时光一去不复返,可我总爱幻想,总想着我和他的曾经。 我想,如果可以回到从前,我要好好对他。因为他对我的喜欢,很温暖...
    傾芯阅读 3,192评论 0 2

友情链接更多精彩内容