0x1. 了解FPS游戏自瞄漏洞
经常玩游戏的朋友,应该知道FPS游戏,例如:穿越火线,逆战等等,他们的特点就是以第一人称视角进行操作人物,屏幕中间会有一个准星,通过准星瞄准敌人进行攻击以达到击杀效果和游戏体验。0x2. 利用某FPS网络游戏进行分析
-----------------------------------------------------------------------------------------------------------------------------------------------------
①开始分析鼠标坐标内存地址
我分析的游戏是创世战车,这是一款FPS射击网游,由于我已经提前逆向过,所以我们的CE操作顺序依次是:
附加进程->切换为搜索浮点数->搜索未知的初始值 ->鼠标向上搜索增加 ->鼠标向下搜索减少
然后 鼠标向上搜索增加 ->鼠标向下搜索减少重复循环过滤,最后我们剩下9个内存地址,通过修改得知:0x23E3588 是我们的鼠标Y内存地址
-----------------------------------------------------------------------------------------------------------------------------------------------------
②开始分析人物数组
1、按照索引查询元素速度快
2、能存储大量数据
3、按照索引遍历数组方便
-----------------------------------------------------------------------------------------------------------------------------------------------------
③开始分析人物结构
dd [[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+068 人物名称
dd [[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+02B0 人物X坐标
-----------------------------------------------------------------------------------------------------------------------------------------------------
④写遍历器查看游戏数据
大致逻辑如下,可能我的代码功底不是很好,让大家见笑啦~
因为该游戏房间人数最多为32人,所以我们for循环的次数为i<32
-----------------------------------------------------------------------------------------------------------------------------------------------------
⑤分析自瞄朝向
-----------------------------------------------------------------------------------------------------------------------------------------------------
⑥分析自瞄的鼠标X坐标
atan2((敌人Y-我们Y),(敌人X-我们X)),由于该角度取值范围为[0,π/2],从北到东为π/2--0,变化规律为:逐渐减小
也就是说,我们生活中来看,从北到东顺时针为,逐渐减少,但是游戏中变化为:-π->π/2,逐渐增大
所以,继续敲黑板:把生活中的转化为游戏中的,那么我们直接加个负号: atan2((敌人Y-我们Y),(敌人X-我们X))就逐渐增大了
又因为加负号后的生活中取值变化为:-π/2->0 游戏中为: -π->π/2,所以依然需要在原公式的基础上-π/2
那么最终的第一象限的算法也就是:- atan2((敌人Y-我们Y),(敌人X-我们X)) - π/2
以此类推,全部象限的鼠标X算法大致如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------
⑥分析自瞄的鼠标Y坐标
依然,绿色标注的角度为我们的瞄准的Y角度,那么如何计算呢,这一次需要用到勾股定理:
首先我们把上面三角形的临边计算出来:也就是X的平方 + Y的平方 ,然后开平方,我们把这个值设为P
得知了P,得知Z = 敌人的Z-我们的Z,那么我们就可以计算角度了:atan2(Z,P),取值范围为0--π/2 逐渐增大
那么游戏中的变化规律呢,我们看一下:
当鼠标Y为0时,朝向中心位置:
当鼠标向最上方时,大致值为π/2:
当鼠标向最下方时,大致值为-π/2:
那么也就是说如果敌人Z高于我们Z,那么游戏角度处于0--->π/2,生活中角度也为:0-π/2,无需转换
如果敌人Z小于我们Z,游戏角度为:0- -π/2,生活中角度要进行取反,也就是 -atan2(Z,P)
注意此时的Z,也进行了变化,因为我们位于坐标原点,为保证值为正数 所以Z = 我们Z - 敌人Z
所以最终横角度大致代码如下:
最终,我们的算法就结束了,还差最后一步,那就是源源不断的写入敌人的角度数据到我们的鼠标角度中,就可以实现锁定敌人的功能
另外还需要注意一点,该游戏在分析阵营时,在人物结构下未发现阵营数据,通过观察,得知阵营在数组地址 减去 0x38的位置
任意人物的阵营:数组下标*7C0+Crossout.exe+194FD80+2BE8 - 0x38 敌方跟我方的阵营是不同的
我们现在已经做完了几乎全部的铺垫,大致的逻辑如下:
自瞄()
{
得出人物信息()
{
得到自己的属性:坐标XYZ 血量 阵营 是否死亡 鼠标角度;
得到其他人的属性:坐标XYZ 血量 阵营 是否死亡
}
计算角度坐标
瞄准()
{
判断死亡 是否在房间
判断阵营
选择最近的敌人瞄准 10米 100米 威胁最大的
}
}
任意人物的阵营:数组下标*7C0+Crossout.exe+194FD80+2BE8 - 0x38 敌方跟我方的阵营是不同的
人物血量 : [[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+0c0 通过判断敌人血量可以确定敌人是否死亡
人物名称 :[[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+068
人物X坐标 :[[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+02B0
人物Y坐标 :[[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+02B8
人物Z坐标 :[[1C6E1F0]+(([n*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+02B4
人物对象地址:[0143e1f0]+(([01B9FD80+0*07c0+2BE8]&0FFF)+2AAD)*0c 通过判断对象地址值是否有效可以判断是否在房间内
-----------------------------------------------------------------------------------------------------------------------------------------------------
⑦修改内存实现自瞄
大致代码如下,由于我做了些封装,所以,大家明白写法逻辑就可以了: