zoukankan      html  css  js  c++  java
  • FPS 游戏自瞄原理

    了解FPS游戏自瞄漏洞

    经常玩游戏的朋友,应该知道FPS游戏,例如:穿越火线,逆战等等,他们的特点就是以第一人称视角进行操作人物,屏幕中间会有一个准星,通过准星瞄准敌人进行攻击以达到击杀效果和游戏体验。

    由于FPS游戏的特殊游戏体验,所以使得很多不法分子利用逆向知识开发了很多自动瞄准的工具,破坏了游戏平衡。具体的原理如下:
    1.找到存放鼠标准星的坐标基地址
    2.找到人物数组基地址
    3.找到人物数组下人物的相关属性偏移:血量,名字,坐标,阵营等
    4.通过阵营判断是否为敌人,通过血量判断是否死亡,利用算法将自己的准星坐标修改为敌人所处的位置,实现自动瞄准

    利用某FPS网络游戏进行分析

    用到工具:CE,OllyDbg

    首先,我们分析了解一下FPS鼠标准星的知识,并且找出他的内存地址:

    搜索前,我们要理清思路,那就是如何去定位鼠标的坐标,怎么定位比较方便。因为游戏分为鼠标X和鼠标Y两种坐标,鼠标X即左右的坐标,鼠标Y为上下坐标,由于左右坐标在游戏中转一圈无法确定坐标数据是否增大还是减小,所以我们通常分析鼠标的Y,即上下坐标。

    针对鼠标Y坐标变动的情况分析:

    无鼠标准星特殊加密:
    1.向上移动准星坐标增大,向下移动准星坐标减小
    2. 向上移动准星坐标减小,向下移动准星坐标增大

    鼠标准星特殊加密:
    鼠标准星上下无规律变动

    对于没有鼠标准星特殊加密的游戏,我们通常在CE工具中搜索增加或者减少
    对于存在 鼠标准星特殊加密的游戏,我们通常在CE工具中搜索变动或者未变动

    另外,由于坐标等数据精度都是比较高的,所以我们通常搜索浮点数或者双浮点数

    分析鼠标坐标内存地址

    由于鼠标左右移动的值(x坐标)不容易判断(因为可以转一整圈),所以可以通过分析上下移动(y坐标),得到了鼠标Y的内存地址,这个时候,我们不必去搜索鼠标X的内存地址,只需观察该地址相邻或者附近的地址值的变化即可得知鼠标 X 因为鼠标 XY 坐标在游戏中存放是连续的,类似我们在上课写C语言结构体里面变量数据内存地址是连续的一样的道理。
    那么如何查看相邻地址内存呢?CE有个自带的功能:
    在这里插入图片描述

    按照图示的标注的顺序,在下面的窗口编辑框内填入相关地址:
    在这里插入图片描述

    在这里解释一下为什么我们需要填入23E3500,因为鼠标Y地址是: 23E3588,鼠标X在附近的位置,所以我们存在一个取值范围,这个范围不是很大,所以我们填入了一个估值,填入后定义结构体,一切回车默认即可。
    在这里插入图片描述

    至此,我们的鼠标坐标内存地址分析完毕,当然了,分析这个还不够,下面我们来分析一下人物数组及其结构。

    分析人物数组

    我们可以通过某一个变量的值来寻找人物对象地址,最有代表性的就是血量(当然子弹数量什么的也可以)。由于血量精度也比较高,所以存放形式也多为浮点数或者双浮点数,由于精度过高,所以我们不能够搜索精确数值,改为搜索两者之间的数值:
    在这里插入图片描述

    根据血量找到人物对象,再根据人物对象找到人物对象数组,最后定位到数组的基地址:
    在这里插入图片描述

    在这里插入图片描述

    分析自瞄朝向

    古代的时候,对于我们生活的地球,人们会讲“天圆地方”这么一个概念

    那么我们可以借鉴一下,把游戏中的地图看成方的,把我们看做坐标原点,然后建立一个直角坐标系,并且标注上北下南,左西右东:
    在这里插入图片描述

    然后我们先得知一个规律:

    1.如果我们修正鼠标X和鼠标Y为0,那么游戏准星将指向一个东南西北的正方向
    2.前后移动如果人物X坐标未变动或者变动幅度小,则我们处在坐标系Y方向
    3. 前后移动如果人物Y坐标未变动或者变动幅度小,则我们处在坐标系X方向

    所以,确认敌人在哪个象限:
    1.当敌人X>自身X 敌人Y>自身Y 敌人位于第一象限
    2. 当敌人X<自身X 敌人Y>自身Y 敌人位于第二象限
    3. 当敌人X<自身X 敌人Y<自身Y 敌人位于第三象限
    4. 当敌人X>自身X 敌人Y<自身Y 敌人位于第三象限

    分析自瞄的鼠标X坐标

    因为我们得知了鼠标的变化规律,也得知了象限的变化,所以,我们只需要把我们和敌人的角度算出来就可以了。我们以我们为起点,以敌人的坐标为终点,不考虑Z坐标,进行作图,连线,构造三角形,根据几何知识,我们得知绿色的地方即为我们需要瞄准的度数,也就是我们要修改的鼠标的X角度:
    在这里插入图片描述

    分析自瞄的鼠标Y坐标

    Y 坐标可以理解为计算完 X 坐标的基础上再做一次勾股定理:
    在这里插入图片描述

    最终,我们的算法就结束了,还差最后一步,那就是源源不断的写入敌人的角度数据到我们的鼠标角度中,就可以实现锁定敌人的功能。另外还需要注意人物对象所属的阵营,不要误杀了你的队友,如果人物对象结构内没有阵营信息,那么它们大多都在人物对象地址 -0x??? 的位置,然后还要判断对象是否死亡(不要一直锁着尸体),判断锁定的优先级(距离自己跃越近的敌人对自己的威胁越大,应该最先锁定)。

  • 相关阅读:
    CSDN文章列表的CSS实现
    Arcgis for Js之鼠标经过显示对象名的实现
    Java ssh 访问windows/Linux
    HTTP长连接实现“服务器推”的技术
    Eclipse设置、调优、使用
    Quartz的配置文件quartz.properties详解
    Quartz所使用的表的说明
    Quartz动态添加、修改和删除定时任务
    Quartz的misfire特性
    项目中使用Quartz集群分享--转载
  • 原文地址:https://www.cnblogs.com/csnd/p/15613487.html
Copyright © 2011-2022 走看看