IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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; //存放游戏保护代码
char _myFunCode[8]{ (char)0xE8,(char)0x00,(char)0x00,(char)0x00,(char)0x00,(char)0xFF,(char)0xE0,(char)0xCC }; //定义一个构建自己函数和跳转的汇编指令

定义函数:

unsigned getAddress(int _index); //根据分发函数的值获取游戏代码地址? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bool InitEntryCode();//解析保护代码

函数:

unsigned _stdcall GetFunctionAddress(int index)
{
?? ? ?
?? ?
?? ??? ?return rData->getAddress(index);
?? ?
?? ?
}

解析:通过我们定义的汇编会跳转到这里根据参数(push 0 ,push1 ...)计算地址并跳转到指定游戏代码执行

unsigned getAddress(int _index)
{
?? ?unsigned result = (unsigned)this->_EntryCode[_index];
?? ?return result;
}

解析:根据参数分发地址

bool? ? InitEntryCode()
{
?? ?TCHAR fileModule[0x100];
?? ?GetModuleFileName(NULL, fileModule, 0x100); ?//获取游戏名称
?? ?auto hFile = CreateFile(fileModule, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
?? ?if (hFile == INVALID_HANDLE_VALUE)return false;
?? ?DWORD dRead;
?? ?DWORD fileLen = GetFileSize(hFile, &dRead); //获取文件大小
?? ?char* _data = new char[fileLen]; ??
?? ?
?? ?if (ReadFile(hFile, _data, fileLen, &dRead, NULL)) ?//读取文件到_data
?? ?{
?? ??? ?
?? ??? ?char* _dataBegin = (char*)_data;
?? ??? ?unsigned* _uRead = (unsigned*)(_data + fileLen - 4);//定义指针指向文件末尾-4的地方,刚好是记录的源文件大小
?? ??? ?fileLen = _uRead[0]; //获取源文件大小
?? ??? ?_uRead = (unsigned*)(_data + fileLen);//指向源文件末尾,我们保护数据的开始位置
?? ??? ?unsigned code_count = _uRead[0]; ?//获取到有多少段保护代码
?? ??? ?_data = _data + fileLen + sizeof(code_count); ?//把指针往后移动,指向第一个结构体
?? ??? ?PCODEConText _conTextArrys = (PCODEConText)_data;
?? ??? ?_data = _data + sizeof(CODEConText) * code_count;//把指针继续往后移动,指向重定位偏移的位置
?? ??? ?_EntryCode = new LPVOID [code_count];
?? ??? ?for (int i = 0; i < code_count; i++) ?//分别解析这两端保护代码
?? ??? ?{
?? ??? ?
?? ??? ??? ?_EntryCode[i] = new char[_conTextArrys[i].len+2];
?? ??? ??? ?char* adr = (char*)_EntryCode[i];
?? ??? ??? ?adr[0] = 0x9D;
?? ??? ??? ?adr[1] = 0x61;
?? ??? ??? ?unsigned offset = sizeof(_conTextArrys[i].r_count)* _conTextArrys[i].r_count; //计算记录偏移数据到代码的偏移
?? ??? ??? ?memcpy(((char*)_EntryCode[i]+2), _data + offset, _conTextArrys[i].len); ? //拷贝代码
?? ??? ??? ?//修复重定位
?? ??? ??? ?unsigned short* rel = (unsigned short*)_data; ?//定义指针变量指向第一个偏移的数据
?? ??? ??? ?for (int x = 0; x < _conTextArrys[i].r_count; x++)
?? ??? ??? ?{
?? ??? ??? ??? ?unsigned* _callAdr = (unsigned*)(((char*)_EntryCode[i] +2)+ rel[x] + 1); //指向E8 后面的地址
?? ??? ??? ??? ?_callAdr[0] = _callAdr[0]-(unsigned)(((char*)_EntryCode[i] + 2) + rel[x])-5; //重定位地址值 ?E8 XXXX=目标地址-当前地址-5 ?因为制作保护程序的时候已经计算出了目标地址
?? ??? ??? ?}

?? ??? ??? ?_data = _data + offset + _conTextArrys[i].len; //把指针移动到下一段保护代码偏移的位置
?? ??? ??? ?DWORD dOled;
?? ??? ??? ?VirtualProtect(_EntryCode[i], _conTextArrys[i].len+2, PAGE_EXECUTE_READWRITE, &dOled);
?? ??? ?}
?? ??? ?delete[]_dataBegin;
?? ?}
?? ?else return false;

//写入分发函数
?? ?auto hMod = GetModuleHandle(NULL); //获取游戏地址
?? ?unsigned addMod = unsigned(hMod);
?? ?unsigned codeAdr = addMod + 0xC2EFFC; ? //算出我们找到的那块内存的地址
?? ?DWORD dOld;
?? ?::VirtualProtect((LPVOID)codeAdr, 8, PAGE_EXECUTE_READWRITE, &dOld); //修改内存属性
?? ?unsigned* read = (unsigned*)codeAdr; ? ? ? ?//定义指针指向那块内存的地址
?? ?read[0] = (unsigned)this->_myFunCode; ? ? ? //把函数写入该地址
?? ?read = (unsigned*)(this->_myFunCode + 1); ? //把指针指向call后面的地址值 ? ? ? ? ? ? ? ? ?
?? ?read[0] = (unsigned)GetFunctionAddress - 5 - (unsigned)(this->_myFunCode); //计算好地址写入
?? ?return true;
}

解析:该函数是核心解析函数,通过读取文件依次解析出各个数据,并再循环中写入每段保护代码,并重新计算需要重定位的地址。注意要再每段代码前写入 popfd 和popad来恢复寄存器的值。

总结:

通过文件读取来读取我们保护的数据,并通过该数据把保护代码写入到插件中,当游戏执行到保护代码时会先进行寄存器数据的保存,然后跳转到我们指定的地址,进去后执行我们的分发函数,通过参数来跳转到我们插件中保护的代码,进入后首先恢复寄存器的值然后执行游戏代码。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 14:09:05  更:2022-02-06 14:10:51 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码