reverse_xiaoyu

忘记并不可怕,可怕的是你从来就都不知道!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

引言

本文转载来自:https://xz.aliyun.com/t/5341?tdsourcetag=s_pcqq_aiomsg

本文转载来自:https://xz.aliyun.com/t/5341?tdsourcetag=s_pcqq_aiomsg

本文转载来自:https://xz.aliyun.com/t/5341?tdsourcetag=s_pcqq_aiomsg

破解软件主要可以通过以下方法进行

  • 字符串定位方法
  • 相关API定位
  • 逆向算法
  • 等等

本片文章主要通过一个例子进行软件破解技术中API定位的学习和相关工具的使用

破解实例

下面是一个未破解版的打开情形,那我们就此可以合理联想到,为了广告展示它这里可能调用了CreateWindow、CreateDialog、DialogBox还有第三方库的创建窗体的API,下面我们根据这个思路正式开始

排除第三方库

通过导入表查看工具,可以看出没有MFC和QT的导入表

定位API

排除掉第三方库的api,那么我们标准库的API就没多少了,我们收集一下,CreateWindowExA、CreateWindowExW、CreateDialogA、CreateDialogW、DialogBoxA、DialogBoxW。

然后我们可以用两种方法来再次排除一些没有用到的API,精确定位具体用到的API

  • 1.通过导入表或者x64dbg调试器的符号窗口查看具体API

  • 2.通过调试器在符号地址下断点,查看调试器返回的信息

这样我们最后只剩下了CreateWindowExWAPI

逆向过程

使用工具

  • x64dbg

  • 64位Winrar

步骤

1、给CreateWindowExW下上断点

2、F9运行到断点位置,跳过第一个停在入口点位置的断点,我们就停到了CreateWindowExW代码实现的位置

这里我们用栈回溯方法看是哪个位置调用的当前API,这里可以从红框看出都是系统模块调用的,继续F9忽略系统模块的调用(可以从符号窗口看具体哪些是用户模块)

[^堆栈调用]: 最上面一层是正在执行的调用,下面是外层。例如函数a调用b,b调用c,这里我们正在执行函数c的代码逻辑,c的代码逻辑就是最上层,b是第二层、a是第三层

3、 查看到用户模块调用了CreateWindowExW,我们F9继续执行,因为广告窗体是第二个打开的,我们需要等待winrar程序窗体打开后再关注广告窗体的创建

4、 下面可以看到winrar自己的窗体成功创建,我们双击这一行就跟随到了000000000029B7F0地址处,也就是CreateWindowExW执行完成后继续执行的下一条语句

5、 进入CPU视图,我们看见了调用CreateWindowExW的具体位置

6、 首先我们先我们将这句调用API的16进制指令复制保存下来(方便我们错误定位后,下载可以快速跳转到这个位置继续我们的流程)

接着我们在这个API调用的地方F2下断点,在断点窗口中删除CreateWindowExW处的断点

ctrl+F2配合F9重新运行到我们刚才下断点的位置,使用NOP填充掉我们选中的行,然后F9继续运行,检测是否我们正确填充掉了广告窗体创建的代码

7、 广告窗体未再出现,接着我们将修改后的文件dump下来替换掉原来的exe文件,彻底实现去除广告的功能。具体操作:右键->补丁->修补文件 然后选择个位置dump处修改后的文件,接着替换掉原来的文件。

双击打开exe文件,广告已移除

编辑个人Log

使用Resource Hacker通过字符串搜索到你要修改的字符串,手动修改后编译保存即可完成个人log的植入

小结

本片文章主要学习到:

  • 栈回溯方法
  • 调试工具的使用
  • 普通软件破解思路

不足

  • 相关API不熟悉:我在分析的过程中主要是对C++程序开发这边没什么基础,导致我浪费大量时间手动跟踪CreateWindowExA、CreateWindowExW这两个API,观察具体在哪个位置执行API后会立刻出现窗体。

改进

  • 尝试编写程序来帮助熟悉API以及程序执行调用流程
posted on 2019-09-10 22:34  Reverse-xiaoyu  阅读(675)  评论(0编辑  收藏  举报