某游戏辅助功能分析

news2024/9/23 19:28:04

FPS游戏发展至今,阻挡外挂开发者脚步的往往不是数据和功能开发,而是高难度的检测。
现如今,检测的手段越来越多,也越来越五花八门。列如:
检测参数,检测堆栈,检测注入等等。
CRC是众多检测手段中最为常见的,同时在各大新手和老鸟之间也广为津津乐道。那么今天和大家一起慢慢揭开“神秘”的CRC。

先来了解一下什么是CRC,百科给我们的解释是:
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
在游戏领域,咱们通俗易懂的讲,CRC即是对比。既然是对比,那么就需要两个值,一个是被修改的地址/代码段的值,一个是用作对比的值。当地址的值 != 对比的值,那么反作弊系统将通过发包等手段告诉服务器,进行踢下线,封号等操作。
那么,CRC一般在内存中都长什么样的呢?举个例子:

某内存代码段中,出现以下代码:

mov eax,xxx
CMP eax,1
jnz xxxxxxxx

假设,jnz这局代码是执行换弹完毕的动作,那么咱们想要零秒换弹的功能,在服务器不做验证的情况下,咱们可以修改cmp 或者 jnz为 JMP,在换子弹的时候,强制执行换弹完毕的动作,那么如果改了这个地方,CRC会如何查?

首先 JNZ xxxxxxxx 二进制的代码 模样如下

即 0F 85 xxxxxxxx
那么,咱们再来看看,JMP的模样

即 E9 xxxxxxxx

假如,我将此处改成CALL?他又会变成什么样?

E8 xxxxxxxx

通过对比,相信大家知道哪里发生了变化。
原代码, 为 0F 85 但是不管你如何修改,此处都会发生变化,CRC扫描的即是这个变化的值。
在某个地方,可能有这样一串效验的代码:
mov eax,刚刚JNZ代码段的值
cmp eax,0f85
jnz 是否上报异常
在此检测代码处,咱们是不是又可以给他修改,不让其执行上报的代码?
同样,其他地方,也可以查询此处是否被修改。那么咱们要伪造几层,处理多少个地方,取决于游戏查了几层,验证了多少地方。
通过以上的例子,相信大家对CRC有了简单的了解。
接下来咱们实际的去游戏中,更深层的揭露它的“面纱”。
相信穿越火线(cf)大部分人都知道,一个发展了十多年的老游戏,检测技术已经相当成熟,有很多地方值得我们学习和借鉴。
以该游戏的内存透视为例子(基址由网络收集) 7B65CC

该地址在未修改的情况下,默认的值为16777217 即十六进制的1000001,那么,将1000001改为某些值的时候,即可实现透视效果,在这里可以简单的猜测和了解一下该透视的实现原理,当然这不是本文主要探讨的内容。——该地址可能与游戏中的某些模型有关,D3D渲染引擎读取该地址的值,当人为的修改后,即改变了渲染的顺序或者加载不了某些模型实现透视效果。
效果图如下:
在这里插入图片描述
在这里插入图片描述
此时此刻,人物透视实现了,同时也改变了该地址的值,如此关键的位置,肯定是有CRC或者其他手段在循环检测,即循环访问该地址,咱们右键查看访问该地址的代码,如下几图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
经过观察发现, 前两条代码基本可以忽略,因为检测代码不可能在短短几秒钟内访问上千次。值得关注的是第三条访问代码,每隔3秒钟进行一次访问,是不是和印象中的检测很像呢?
该代码究竟起了什么作用,是不是让多数人束手无策的"CRC"?,咱们一步步把它“扒光”便知。
OD附加后,跳转至该访问代码处:
在这里插入图片描述
发现如上,代码段位于 gamerpcs模块,那么这个时候咱们就要先记一下该地址位于模块中的所处位置,防止游戏奔溃导致数据丢失 计算出该地址为 GameRpcs.dll+33D5F。
记录好后,在该位置下段,咱们观察一下EAX的值
在这里插入图片描述
EAX=007B65CF [007B65CF]=0x101
跟咱们内存透视地址007B65CC是不是很接近呢?
那么把该地址拿到CE中进行观察和对比,如下图
**加粗样式**
在这里插入图片描述
当我们修改 [eax],发现依旧可以实现透视,那么可以确定,实际可以实现透视的是007B65CF,也就是基地址 +3的位置,同时,他检测应该也是针对007B65CF。
回过头来观察代码:
09C83D5F 8A00 MOV AL,BYTE PTR DS:[EAX]
09C83D61 9C PUSHFD
09C83D62 E8 01000000 CALL GameRpcs.09C83D68

[EAX]传值给 AL
然后进行一个CALL
[EAX]里面存放的是什么?
正常不修改的情况,存放的是0x101
如果修改了就会变成修改的值。
假设下面的CALL是检测对比(八九不离十),只要咱们给AL所传递的值是正确的,不管下面的CALL如何检测,所得出的返回值都是正确的。
再次下段验证,传递给AL的是不是被修改过的值呢? 如下多图:
在这里插入图片描述
原来的值,未修改
给AL传递的是0x01
那么修改该地址的值,再次下段验证
在这里插入图片描述
修改过后,给AL传递的值是0x00
从上面两图所得出,他实际传入/检测的值是007B65CF的最后一个字节,再次将值修改为其他下段验证:
在这里插入图片描述
通过多次下段验证,确认了传递给AL的值就是“透视地址”的值,如果给他传递的值不正确,服务器就会知道你修改内存,进行封号,踢下线等等操作。

知道了此处代码的作用,应该如何进行伪造?
直接NOP?不让其执行检测代码?
那肯定是不行的。
将检测CALL或者某些关键的位置NOP,不让其执行检测代码,这是早期最为常用的手段。而经过这么多年的发展,游戏公司和逆向工作者都在进步。
假设将该CALL 在某处 NOP不让其执行,确实不会触发检测代码。但是假如CALL内有必要的心跳要发送至服务器,同时也会将心跳截断,服务器也会知道你修改了内存代码。

最好的办法就是在不影响代码正常执行的情况下进行伪造,可以在适当的位置进行HOOK,在自己的函数中给AL/或者eax赋值,即0x01或0x101。

hook代码如下图(OD版):

56AF3D5C 83C4 04 add esp, 4 在此处下HOOK
56AF3D5F 8A00 mov al, byte ptr [eax] 还原这两条代码
56AF3D61 9C pushfd 跳回这个地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如此一来,在不影响代码正常执行的情况下便成功伪造了地址正常的值。
假设他有多重检测,下一个检测地方应该在哪里?
在这里插入图片描述
咱们修改了内存代码段,使其发生了变化,如果多重扫描和检测,只需扫描此处修改的JMP,当然,咱们也可以在此处下段,继续伪造。他检测了多少层,那就就伪造多少层。但是在win10系统上,在该处并未发现有其他代码访问,希望贵公司早日修复。
以下是C++版本伪造例子
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机 一、场景 在之前绘制完毕雷达显示图之后,这时候,我们能匹配的场景就更广泛了,比如说…

string类模拟实现

了解过string常用接口后,接下来的任务就是模拟实现string类。 目录 VS下的string结构 默认成员函数和简单接口 string结构 c_str()、size()、capacity()、clear()、swap() 构造函数 拷贝构造函数 赋值重载 析构函数 访问及遍历 容量操作 reserve resize …

C语言(typedef,函数和指针)

目录 一.typedef 二.函数和指针 一.typedef typedef是一种高级数据特性,利用typedef可以为某一类型自定义名称。typedef创建的符号名只受限于类型 typedef unsigned char BYTE; BYTE x 这里的BYTE就相当于unsigned char x typedef unsigned char *BYTE; BYTE x,…

[oeasy]python0082_VT100_演化_颜色设置_VT选项_基础色_高亮色_索引色_RGB总结

更多颜色 回忆上次内容 上次 了解了控制序列 背后的故事 一切标准 都是 从无到有 的就连 负责标准的组织 也是 从无到有 的 VT-05 奠定了 基础颜色 黑底 绿字隔行 扫描 但 多颜色设置 是如何出现 的呢??🤔 控制字符 1974年 产品 从VT05…

语音识别系列之脉冲神经网络特征工程

人工神经网络(Artificial Neural Network, ANN)中的单个人工神经元是对生物神经元的高度抽象、提炼和简化,模拟了后者的若干基本性质。得益于误差反向传播算法,网络权重可根据设定的目标函数得到有效地调整,ANN在视觉、…

LeetCode初级算法题(Java):反转链表+统计N以内的素数+删除排序数组中的重复项

文章目录1 反转链表1.1 题目1.2 解题思路解法1:迭代解法2:递归1.3 题解代码2 统计N以内的素数2.1 题目2.2 解题思路与题解代码解法1:暴力算法代码展示解法1:埃氏筛代码展示3 删除排序数组中的重复项3.1 题目3.2 解题思路3.3 题解代…

近红外染料标记小分子1628790-37-3,Cyanine5.5 alkyne,花青素CY5.5炔基

试剂基团反应特点:Cyanine5.5 alkyne用于点击化学标记的远红外/近红外染料炔烃。氰基5.5是Cy5.5的类似物,一种流行的荧光团,已广泛用于各种应用,包括完整生物体成像。在温和的铜催化化学条件下,该试剂可与叠氮基共轭&a…

构建RFID系统的重要组成部分

RFID读写设备,通常被用来扫描读取安装了RFID电子标签的目标物品,能实现快速批量无接触读写,是构建RFID系统的重要组成部分。RFID读写设备,通常有固定式读写设备和可移动读写设备两种。下面来了解一下RFID的特点,RFID系…

EZ-Cube简易款下载器烧写使用方法

一、硬件连接 跟目标芯片接4根线 VCC、GND、TOOL、REST 四根线,如果板子芯片自己外接电源的,VCC 线可以不接。 二、 安装烧写软件和驱动 烧写软件:https://download.csdn.net/download/Stark_/87444744?spm1001.2014.3001.5503 驱动程序&a…

java微信小程序的在线学习平台

本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对在线学习平台进行需求分析,得出在线学习平台主要功能。接着对在线学习平台进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程…

Apache JMeter 5.5 下载安装以及设置中文教程

Apache JMeter 5.5 下载安装以及设置中文教程JMeter下载Apache JMeter 5.5配置环境变量查看配置JDK配置JMeter环境变量运行JMeter配置中文版一次性永久设置正文JMeter 下载Apache JMeter 5.5 官方网站:Apache JMeter 官网 版本介绍: 版本中一个是Bina…

TCP协议 ---可靠传输的各种机制

目录 一、可靠 确认应答机制:保证数据可靠、有序的到达对端 超时重传机制 二、效率 2.1 提高自身发送数据量 滑动窗口机制: 滑动窗口的发送缓冲区是环形队列 滑动窗口的大小会变化吗? 滑动窗口的nb之处 滑动窗口丢包问题 2.2 对方…

锻炼管理器wger的安装

本文是 2021 年 2 月完成的,最近因为工作比较忙,就把这些老文章翻出来,但为了发表,老苏差不多又重写了一遍。 因为当时跑的是 wger/apache ,现在新的 wger/apache 版本在老苏的机器上,会遇到 AH00141: Coul…

Windows Git Bash 配置

Windows Git Bash 配置 本文参考的文章: 在 Windows 的 Git Bash 中使用包管理器 - iris (ginshio.org)Git bash 安装 pacman & Windows 解压 zst 文件 | 伪斜杠青年 (lckiss.com) 一、Git的安装 Git 的安装应该是都会的,但还是应该说以下&#…

前端常见基础面试题css篇

目录 1.css3有哪些新特性? 2.CSS有哪些基本选择器?它们的权重是如何表示的? 3.css 选择器的类型优先级排序 4.写出几种CSS实现元素两个盒子垂直水平居中的代码 5.CSS 常见的伪类和伪元素有哪些? 6.CSS的引入方式有哪些?ink…

CMMI-外包与采购管理

外包与采购管理(Outsourcing and Procurement Management, OPM)是指外包管理和采购管理,目的是选择合适的承包商和供应商,并依据合同进行有效的管理。外包与采购管理过程域是SPP模型的重要组成部分。本规范阐述了外包与采购管理过…

自定义认证器

自定义认证器工作流程 1、设备向AWS IoT发送http请求,包含token和token签名 2、IoT判断这是一个自定义认证请求,然后确认token和token签名是否匹配 3、Lambda函数验证token之后,将输出5项数据, isAuthenticated:求是…

Zookeeper入门与应用

Zookeeper入门与应用1.简介1.1.应用场景1.2.Zookeeper的设计目标1.3数据模型2. 单机安装3.常用shell命令3.1.查询3.2.创建3.3.更新3.4.删除4.zookeeper的Acl权限控制案例/远程登录acl 超级管理员5.zookeeper的 JavaAPI连接到Zookeeper5.1.新增节点5.2.修改节点5.3.删除节点5.4.…

4、数组、切片、map、channel

目录一、数组二、切片三、map四、channel五、引用类型一、数组 数组: 数组是块连续的内存空间,在声明的时候必须指定长度,且长度不能改变所以数组在声明的时候就可以把内存空间分配好,并赋上默认值,即完成了初始化数组…

Spring反射内置工具类ReflectionUtils

Spring反射内置工具类ReflectionUtils前言反射1,什么是反射2,反射的实现2.1获取class对象的三种实现2.1.1Object ——> getClass();2.1.2 任何数据对象(包括数据基本类型)都有一个静态的class属性通过Class类的静态方法&#x…