FPS透视自瞄解析与防范
2020-05-15 12:53:58 Author: bbs.pediy.com(查看原文) 阅读量:752 收藏

你是否在游戏中遇到"高手"?不论是预判还是枪法都是一流,只要你露个头,就会瞬
间被带走。躲在箱子,墙壁后面也无济于事,“高手”们还是可以轻松的找到你,有的甚
至会“预判 ”,直接对着障碍物穿箱扫射,直接带走躲在后面的敌人。这些人仿佛长了
“上帝之眼”,总能知道你躲在何处,仿佛落地自带八倍镜,“八百里开外”一枪爆头。
究竟是真高手,还是“神仙”?仁者见仁智者见智。
透视自瞄——fps 玩家永远甩不掉的梦魇,fps 游戏最大的恶性毒瘤。
图片描述
从最早的 cs,到现在的吃鸡,都深深的受其毒害,无一幸免。那么该功能影响如此
恶劣,为何游戏公司迟迟不将其和谐(封禁)?不是游戏公司不想,而是根本无能为力。
与其它修改内存类辅助不同,自瞄完全可以在不修改内存的情况下用纯算法,配合鼠标移
动,外设等硬件设备实现。严格意义上来说,自瞄算不上外挂,如图色自瞄,只是一种模
拟人工,代替玩家实现瞄准的辅助。当然,某些直接修改内存准星数据实现的自瞄,已经
达到外挂定义的范畴,而这种自瞄,也相对好检测。那么透视呢?其实自瞄就相当于知道
了敌人的位置,透视只需将其所在位置画出来。
假设笔者是该游戏安全人员,同时也是给相关同行的建议,针对自动瞄准,应该如何检测:
1、模拟类自瞄
一、Hook windows 所提供的所有按键操作、鼠标操作类接口,函数全部由游戏安全系统
接管。
二、既然 Hook 了相关函数,那么就可以被突破,Hook 被还原,还要在代码段上下 crc,
防止被还原 Hook,在 crc 上多次套 crc,多设防御关卡。
三、检测鼠标轨迹和移动速度,没有谁可以一直直线移动鼠标。
2、内存类自瞄
一、Hook windows 所提供的所有“写内存”类接口,如 WriteProcessMemory(),
函数全部由游戏安全系统接管,检测到非自身或者未知程序调用该类型函数对游戏进行操
作时,将其踢下线。
二、同模拟类自瞄第二条。
三、同模拟类自瞄第三条。
四、加密鼠标横轴(x 坐标),且多个地址同步准星数据,当非法修改了准星位置,即准
星数据不同步,即可知道非法修改了内存。
那么接下来,同笔者一起分析,透视自瞄究竟是如何实现的呢?
其实只要实现了自瞄,就相当于实现了透视,只是需要开发者通过一系列算法将其绘
制在屏幕上而已。而实现自瞄,对于有相关工作经验的人来说,也算不上难,一套公式,
几乎“通杀”所有 FPS。自瞄算法可以简单的分为两种,一种通过玩家坐标和准星位置进
行计算,一种为”矩阵自瞄“,计算模型骨骼等等,其实两种自瞄本质意义上区别不大,
各有各的好处,只不过第二种更为精准,第一种则更为方便,需要的数据更少。
那么实现基本自瞄,需要的数据有哪些?笔者做了一个简单的总结:
1、视角、即 FOV
作用:计算敌人是否在屏幕可视范围内。
2、修改有效的准星数据地址或瞄准 call
作用:填入敌人所在坐标,实现自动瞄准
3、敌我坐标,即敌我 X Z Y 坐标
作用:计算出敌我距离,敌人所在”圆的位置。
知晓了所需数据,下一步?当然是实践了,说得再好,想得再美,不如亲自动手实践。
首先是寻找视角(FOV)的思路,在这里再详细的了解下视角,视角即你所能看到的范围,
在 FPS 游戏种,可以理解为你屏幕上所能看到的,那应该如何寻找这一屏幕所视?
熟悉 FPS 的都知道,在游戏中存在着”狙(和)击(谐) 抢“,(qiang 为敏感词,
以下用 xx 代替), 而这种 XX,有着瞄准镜,在进行瞄准的时候,可视距离变远,同时可
视范围是不是变小了呢?没错,这就是很好的突破口。
根据以往分析的经验,这种表达坐标/范围的地址,往往都是浮点型,或者双浮点型,
那么在未开镜的情况下,CE 先尝试搜索未知的浮点型,如下图所示:
图片描述

然后进行第一次开镜,如下图所示
图片描述
开镜后,是不是如先前分析,所看到的物体变大,同时可视范围变小了呢?,那么搜索,
减小的数值,如下图所示:
图片描述
再次进行二次开镜,缩小可视范围,重复以上步骤:
图片描述
图片描述
关闭狙击镜之后,搜索增加的数值,如下图所示:
图片描述
图片描述

来回重复几次赛选之后,发现的绿色的地址,即为基地址,那么可以直接拿来使用。
(防止恶意用途,地址打码)
图片描述
反外挂建议:
在不影响游戏流畅性的前提下,将视角地址存放在堆栈或临时申请的内存地址中,即用即
销,增大逆向难度。
数据 1 轻松搞定,由简到难,接下来分析准星数据/或者瞄准 call。

首先整理一下思路,如何找到修改有效的准星坐标地址呢?玩家移动鼠标,画面跟着
移动,同时准星在画面中所处的位置也跟着移动,而屏幕上是以 2D 的方式显示,2D 可以
有两个坐标,也就是 X 跟 Y 坐标。在 fps 游戏中,横轴是可以无限原地转圈的,而竖轴上
下大概在 180 度左右,所以 Y 往往比 X 更合适用来当作这一数据的突破口。那么假设准星
数据做了处理,应该如何找到瞄准 call 呢?搜索出与准星坐标相关的地址后,移动鼠标进
行访问断,就有可能断到相关的函数。

前面有讲,坐标/范围类数据,通常都是浮点或双浮点,那么搜索未知的浮点值:
鼠标朝上,搜索增加的数值,鼠标朝下,搜索减少的数值,如下图

搜索减少的数值:

![图片描述](upload/attach/202005/893619_NSM4ADFV5XZ3753.png)   

搜索增加的数值:
图片描述

经过重复搜索,发现并没有找到我们想要的,那么尝试给他反一下,朝上为减少,朝下为
增加,步骤同上,这回得出了我们想要的地址 且在+4 的位置,发现了 X 坐标,但是 X 坐
标做了简单加密:
图片描述
存放准星数据的地址,并非基地址,也就是说下次重启游戏,或者换房间将会进行变
化,还需要追寻它的来源,防止恶意用途,追寻来源过程这里省略,本文只做分析。接下
来可以分析一下他是以何种方式给 X 轴加密。
FPS 分析加密的 X 轴,其实不一定要去逆向他加密的过程,大多数情况可以观察数据
变化做分析。观察一下 X 轴的变化,人物往左,值减小,一直逆时针自转,一直减小,甚
至将值修改为-9999 也可以识别,人物往右,值增加,一直顺时针自转,一直增加,甚至
将值修改为 9999 也可以识别。这样看的话,往往容易被混淆。可以定一个点,记住地址
的值,人物转一圈,回到原来的点,观察值增加/减少了多少,最终发现人物自转一圈的值
为 2π,那么这时候可以得出结果:
该游戏的 X 轴自转一圈,为 2π,不论地址的值是多少,只要用 值/2π 取余,就可
知道准星在圆的具体位置。
除了要分析出加密的准星数据,还需要分析出坐标在”圆“中的分布情况,这个相对
简单,只需分析出朝哪走,X 坐标增加,朝哪个方向,X 坐标减少,Y 坐标同理 即可。笔
者分析如下图分布:
图片描述
反外挂建议:
该游戏虽然对准星进行了加密,但却过于简单。在不影响游戏流畅性的前提下,建议将 X
坐标进行动态加密,达到”肉眼无法分析“的效果,以增大逆向难度。
接下来可以简单的配出自瞄公式,如下:
0 —— pi/2
水平角 = #pi ÷ 2 - atan ((自身 Y - 敌人 Y) ÷ (自身 X - 敌人 X))
pi/2——pi
水平角 = atan ((敌人 Y - 自身 Y) ÷ (自身 Y - 敌人 Y)) + #pi ÷ 2
pi/-pi——-pi/2
水平角 = 0 - atan ((敌人 Y - 自身 Y) ÷ (敌人 X - 自身 X)) - #pi ÷ 2
-pi/2——0
水平角 = atan ((自身 Y - 敌人 Y) ÷ (敌人 X - 自身 X)) - #pi ÷ 2
敌人 Z>自身 Z
俯视角 = atan ((敌人 Z - 自身 Z) ÷ 距离)
敌人 Z<自身 Z
俯视角 = 0 -atan ((自身 Z - 敌人 Z) ÷ 距离)
还有最后一个数据,自身的坐标和玩家的坐标。相对前面两个数据,该数据与之比稍
难。因为一般敌人/怪物坐标,都是以数据结构的形式进行遍历,牵扯到的相关数据较多。
既然牵扯到的相关数据较多,那么突破口也众多,如血量,人物坐标,敌人数量等等。
以人物坐标为例,3D 坐标与屏幕 2D 坐标不同的是,多了一个 Z 坐标,2D 即 X 跟 Y, 3D 则 X Y Z。在寻找人物坐标时,Z 坐标(高度)往往更合适当突破口。搜索大致流
程如下:
人物站在地面,搜索未知的浮点。
人物站在高处,搜索增加的浮点。
图片描述

来回重复几次,很容易筛选出一个修改有效的(可实现飞天遁地)地址,那么 OD 附加,
顺着往上追,很容易的来到了人物对象首(CE 查看访问代码也很容易看出),在对象上下
段,轻而易举的来到了玩家数组,在玩家对象下
+E0
+E4
+E8
的位置,分别对应玩家的 X Z Y 坐标,得到了坐标之后,配合上面分析的公式,计算
出结果给其写入准星地址,即可实现自动瞄准。
前面有讲,实现了自动瞄准,其实就实现了透视,剩下的工作,就是将敌人所在位置,
用代码绘制出来。至于绘制方式,有很多种,D3D 绘制 GDI 绘制 甚至还有更夸张的 ,
建立一个 MFC 透明窗口盖上去绘制都可以。唯一的难度就是如何将 3D 坐标转换为 2D 坐
标。
这个时候,我们先前找的视角(FOV)派上用场了。 首先视角,经过测试,我们
只找了横向视角,不过没关系,只要知道一个,另外一个视角可以简单的口算出来。视角
有什么作用呢?前面了解到,在 FPS 中,视角可以理解为游戏窗口显示的画面,那么,可
不可以这样理解?
如下:
假设游戏分别率为 1024768
1024 为 X
768 为 Y X 视角即=2D 1024
Y 视角即=2D 768
前边公式可以知道敌人在“圆”的位置,那么就很简单的可以算出敌人是否在视角内,
视角也是"圆"的一面,只要敌人在这个面内,就在可视范围之内。
假设 X 视角为 π/2,那么视角和 2D 屏幕的比例即为——1024/(π/2),那么如何
知道 Y 视角?768
(1024/(π/2))这个比例就可以轻松得到,反之知道 Y 视角,也可
算出 X 视角。
那么接下来就可以直接在 2D 窗口上绘制方框了,假设敌人在 x 视角内坐标 0.56 的
位置,那么 0.56*(1024/(π/2)),即敌人坐在屏幕 X 坐标,Y 坐标同理。最终实现透视
效果如下:
图片描述
反外挂建议:
Hook 所有读内存函数,跨进程实现透视功能,必须要读取游戏内存,读取数据时多多少
少会留下痕迹,可用作判断是否有第三方程序越权。

[求职]想求职找工作,请来看雪招聘投递简历!


文章来源: https://bbs.pediy.com/thread-259484.htm
如有侵权请联系:admin#unsafe.sh