游戏安全实验室 首页 外挂分析 查看内容

FPS游戏自瞄锁头外挂分析和对抗

发布于:2019-6-4 19:16   |    158861次阅读 作者: 外部投稿    |   原作者: 通化程序员

         从游戏安全的角度我们来看看FPS游戏这种类型的游戏变态外挂总是层出不穷如飞天蹲地无后座力加速等等


那么为什么总是无法杜绝这一类变态功能呢


FPS游戏注重游戏体验游戏公司为了保证玩家的流畅性和打击感将许多重要数据放在本地客户端进行处理这就给了外挂开发者有机可乘


但是随着5G时代的到来会得到很大的缓解不过也要考虑到服务器压力


另外自瞄等算法类功能是永远无法完全避免的因为他可以单纯的是把人类的算法自动化精准化而已虽然看上去功能很BT,但实际上他并不是串改游戏代码或则利用什么BUG。


如果在关键处修改一些逻辑代码即可实现多样性的变态功能夸张的说只有你想不到没有做不到。


一个完整的变态功能往往是由多个功能组合而成如果想要检测它不妨分析一下实现原理


功能一子弹加速先前有文章详细讲解有兴趣的朋友可以翻看之前笔者的发文


功能二无需换弹先前有文章详细讲解有兴趣的朋友可以翻看之前笔者的发文


功能三不难看出该玩家明明打在空处却有怪物不断死亡被爆头应该修改了怪物受伤点相关的代码或者通过明文发包发送了打中怪物头部的封包


        说到枪枪爆头很多人第一反应想到的是自动瞄准确实自动瞄准已经司空见惯几乎所有的fps类型游戏都不可避免受其毒害也是我们最熟悉的一种恶性外挂


        然而观上面动态图的效果并非自动瞄准可以看出明明打在了空处却有怪物不断死亡明显修改了客户端逻辑代码那么今天就跟随笔者一起深入分析爆头实现的可能性。

       

正文


        熟悉fps游戏的朋友应该都知道击中部位”,比如击中腿部伤害略低击中胸部伤害略高而击中头部几乎就是满血秒杀从逆向的角度出发不难想象游戏人物/怪物模型 在内存中存在着这样一些地址 

头部受伤点地址

胸部受伤点地址

手部受伤点地址

腿部受伤点地址

等等

        而这些属性很大的可能是人物/怪物的某个下标不妨在遍历出对象以后在对象下进行仔细的观察说不定有意外的惊喜

        可能有的朋友会问知道这些有什么用?  fps特性在此不再重复不明原理的童鞋可以简单粗暴的把fps想象成一个单机游戏”,既然是单机游戏”,是不是数据都在玩家电脑上?   假如将胸部受伤点强制锁定为头部是不是击中玩家胸部以后实际打中的是头部呢如果将所有的受伤点都遍历出来全部锁定为头部是不是可以实现枪枪爆头”?

        明白了枪枪爆头原理那么这个全屏打怪又是什么原理真的是所谓的子弹追踪这么厉害吗其实原理非常简单人物/怪物模型每个受伤点都有一个区域”,而这个区域有着大小属性而击中模型这块区域决定着你打中的是哪里

头部受伤点地址

下标之一  范围:20

胸部受伤点地址

下标之一  范围:50

手部受伤点地址

下标之一  范围:10

腿部受伤点地址

下标之一  范围:30

知道了区域大小这个属性的存在以后是不是很容易就明白了头部区域改为特别大的数值列入原先20,将其改为200,2000甚至更高是不是不管指哪里都可打中目标配合前边分析的枪枪爆头原理即使修改的是其他区域大小”,也可实现所谓的全屏追踪爆头”。

        那么应该寻找这个受伤点和区域大小cf打中人物模型之后无论是何部位准星都会变成红色以此为突破口

        分析工作完毕接下来就是实践笔者一项信奉实践是唯一的真理。fps内存数据变化较快还是老套路先保存内存看过先前文章的童鞋此处自动忽略

OpenProcess ()  //取得游戏句柄

ZwSuspendProcess()  //通过句柄将其挂起保存内存状态

ZwResumeProcess()  //通过句柄恢复挂起还原内存状态

CloseHandle ()  //释放句柄

首先击中人物/怪物的一瞬间也就是准星变成红色的时候将游戏挂起保存内存状态搜索未知的初始值如下两图



在此状态下将其挂起

搜索未知的初始值

       

 恢复内存状态再次击中别和上次同一个部位如上次击中胸部此时可以选择击中腿部将其挂起保存内存状态搜索变动的数值由于需要搜索多次建议拿手枪或者威力较小的枪或者直接在血量较多的模式下搜索否则容易将对象打死


再次挂起保存内存状态

再次挂起保存内存状态

来回重复搜索后发现某个地址在击中不同的部位下数值都不同且平时为0()。直接改这个地址是否可行其实仔细想想以这种方式搜索出来的地址只是击中瞬间读到的受伤点而已修改他并没有什么效果真正的受伤点地址是不会因为被打中而发生变化猜测可能会因为人物移动 跳跃下蹲等发生变化),那我们这么幸苦的搜索有何意义得到了这个受伤点相关的值以后是不是给他进行范围搜索先遍历出当前人物/怪物的对象在对象地址一定范围内进行搜索结果一幕了然搜索出的地址就一个不妨大胆猜测是不是就是上面分析的区域大小

        如实验的怪物对象名称是古代老鼠”,地址处于对象下标值得注意怪物和人物不处于同一遍历下) 0x354 原有值为 15(float),将其修改为200(float),发现在游戏中并没有实际效果说明该地址也不是真正的受伤点”,而用CE查看访问代码的时候却发现在不停的访问证明与其他地方有关联

       那么尝试去去OD中下硬件写入断点来到了一个类似于数组的地方如下图,eax来源于[esp+0x3954],esp来源于一个基地址防止他人恶意用途基址不进行截图)。

且在该地址+4,+8等处都是相似的(float)如下图

那么再次尝试将其修改锁定为200(float),这次终于了有实际效果

注意截图中是以人物模型为例怪物模型方法同上

       

只要准星在该类型怪物附近不用瞄准),都可打中怪物且枪枪爆头说明该处为怪物的头部受伤区域”,而在+4的位置修改为200,也可打中怪物不过失去了原有的爆头效果猜测可能为胸部或腿部受伤区域”。

       而一个图内不可能只有一种怪物也会有BOSS和其他一些小怪想要实现枪枪爆头必须每种怪物都修改受伤区域大小”,仔细观察该地址附近寻找是否有(float)从正向角度出发一般坐标类型的以浮点可以表达的更加精准),都进行一个尝试性的修改如地址附近  [基址]+0x35690 的位置发现的类似的浮点修改后发现为滚球的怪物头部受伤点区域而要将每一种怪物都找出来就需要一定的时间和耐心了

多观察附近地址说不定有意外惊喜单浮点十六进制多以0x4开头

        小结该游戏将模型受伤点区域大小这一属性存放到了相同的遍历下通过ID在某处进行了一个关联而不是在对象之下


        游戏安全防护和反外挂建议


1.对容易被串改的代码进行CRC验证以及CRCCRC。


2.除了本地加一定的检测(CRC之类的之外服务器可以判断爆头率和子弹射速虽说fps实时检测会影响玩家体验但却可以进行数据回扫如玩家打完一局之后进行该对局数据回扫判断其战绩检测爆头),以及流量监控加速类功能会大量给服务器发包)。


3.检测鼠标轨迹和鼠标速度没有哪个变态家伙是可以每次都瞬间直线滑动鼠标进行精准爆头的


4.通过玩家的举报进行精准确认




来源:通化程序员—投稿

GSLAB网站投稿文章仅代表作者本人的观点,与本网站立场无关。

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)


分享到:
踩0 赞1

收藏

上一篇:重生娱乐职员透露:《Apex英雄》中国玩家总数不多 但被封的外挂可不少 ... ...

下一篇:CF典型的检测例子分析

最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部