引言
本文转载来自: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
这样我们最后只剩下了CreateWindowExW
API
逆向过程
使用工具
-
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以及程序执行调用流程