| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 游戏插件开发之防插件剥离的简单保护壳工具设计(利用反汇编引擎实现自动化代码保护)下 -> 正文阅读 |
|
[系统运维]游戏插件开发之防插件剥离的简单保护壳工具设计(利用反汇编引擎实现自动化代码保护)下 |
前言: 感谢:易道云学院 tiger老师指导: 前提:已经做完自动保护工具。主要讲解如何解析生成的保护程序。 分析: 我们已经生成的保护程序,程序末尾首先写入了有多少段要保护的代码,后面是结构体数据,二进制数据如下 ?02 00 00 00:有两段要保护的代码? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?50 c7 c8 00:第一段要保护的代码首地址为 C8C750? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?04 00 :第一段中有4个地方需要做重定位? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?52 00 : 第一段保护代码大小为 0x52? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b0 c7 c8 00 :第二段要保护代码首地址为 C8C7B0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?00 00:第二段中没有需要做重定位的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?15 00:第二段保护代码带下为? 0x15 在这之后写入的是第一段需要重定位地址的相对偏移,后面是第一段要保护的代码,然后是第二段....最后写入的是源程序的大小二进制数据如下: ?通过前面得到第一段有四个重定位信息 0B 00 ,25 00,36 00, 3F 00 这四个数据记录的是4个重定位数据所在地址相对于该保护代码起始地址的相对偏移。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 56 8B F1 ..... 5E C2 04 00 :第一段代码。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 8B 44 24 ..... 01 C2 04? 00: 第二段代码。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2B CA 22 01 :记录的源程序大小. 刚好是19057195。 思路: 通过以上分析我们大致知道了生成的保护程序的结构,通过在插件中定义函数进行解析。 定义变量: LPVOID* _EntryCode; //存放游戏保护代码 定义函数: unsigned getAddress(int _index); //根据分发函数的值获取游戏代码地址? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bool InitEntryCode();//解析保护代码 函数: unsigned _stdcall GetFunctionAddress(int index) 解析:通过我们定义的汇编会跳转到这里根据参数(push 0 ,push1 ...)计算地址并跳转到指定游戏代码执行 unsigned getAddress(int _index) 解析:根据参数分发地址 bool? ? InitEntryCode() ?? ??? ??? ?_data = _data + offset + _conTextArrys[i].len; //把指针移动到下一段保护代码偏移的位置 //写入分发函数 解析:该函数是核心解析函数,通过读取文件依次解析出各个数据,并再循环中写入每段保护代码,并重新计算需要重定位的地址。注意要再每段代码前写入 popfd 和popad来恢复寄存器的值。 总结: 通过文件读取来读取我们保护的数据,并通过该数据把保护代码写入到插件中,当游戏执行到保护代码时会先进行寄存器数据的保存,然后跳转到我们指定的地址,进去后执行我们的分发函数,通过参数来跳转到我们插件中保护的代码,进入后首先恢复寄存器的值然后执行游戏代码。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 5:34:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |