zoukankan      html  css  js  c++  java
  • 软件破解实战篇

    引言

    本文转载来自: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以及程序执行调用流程
  • 相关阅读:
    浅析Python闭包
    1、Spring framework IOC容器
    springcloud 返回流案例
    foreach使用场景
    Iterator遍历集合时不可以删除集合中的元素问题
    Spring整合MyBatis配置
    Mybatis案例配置
    interrupt() interrupted() isInterruped() 区别
    4.对象关系 Map(ORM)数据访问
    3.使用 JDBC 进行数据访问
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11503547.html
Copyright © 2011-2022 走看看