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??? 的位置,然后还要判断对象是否死亡(不要一直锁着尸体),判断锁定的优先级(距离自己跃越近的敌人对自己的威胁越大,应该最先锁定)。

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/csnd/p/15613487.html
Copyright © 2011-2022 走看看