【思路&插件分享】修复清朝回溯 | 热修复CSGO回溯系统 教学

Ambr0se 一级用户组 3天前 107

插件下载:https://github.com/ELDment/Fucking_obliterated_CSGOs_clusterfuck_HVH-hostile_backtrack-system

本文对绿色社区或许没有什么用,初衷是解决CSGO HVH社区经常出现的清朝回溯现象

效果:当外挂(特别是nl)击中超长回溯时,该回溯会被视为无效,不会造成伤害

阅读本文修复思路你需要对x86机器码(操作码)有一定的了解。

本文也会涉及:x86调用约定、汇编指令、栈帧平衡、EIP寻址。


CSGO中有一个名为sv_maxunlag的ConVar

我么发现在CBasePlayer::WantsLagCompensationOnEntity中,引用了这个ConVar进行算法判断

因此所以我们只需要调整相关判断就可以实现控制回溯(还涉及了其他多重考量,这里就不展开讲了)

我们在IDA中查看,发现sv_maxunlag或许是具有FCVAR_DEVELOPMENTONLY标识的缘故

并没有将构造的类存储起来,所以我们就不能直接用https://www.bilibili.com/video/BV1kA6eYgEaG?p=9中提到的方法定位到CBasePlayer::WantsLagCompensationOnEntity

我通过其他办法找到了这个函数(这里就不展开讲了)

我们很轻松地找到了

我们查看汇编,发现三条很关键的东西

movss   xmm1, [ebp+arg_8]

mulss   xmm1, ds:dword_10989B88

mulss   xmm1, [ebp+arg_0]

3FC00000是1.5的IEEE 754浮点数表示形式‌,所以[ebp+arg_0]就对应sv_maxunlag的数值了

但我们查看上文对[ebp+arg_0]的赋值,发现使用的字节空间很小(且x86下movss 不支持立即数),无法制作hotPatch

所以我们只好从这两条累乘(mulss)语句入手

我们发现两个累乘之间惨咋了一条与xmm1计算无关的语句,我们将他放到mulss前面

这样我们班就可以拥有F3 0F 59 0D 88 9B 98 10 + F3 0F 59 4D 08(一共13字节空间了)

假设我们想设置sv_maxunlag为0.05,那么1.5*0.05为0.075,我们只要让xmm1累乘0.075即可

但是x86下的mulss依旧不支持立即数。所以我们要想办法创造数据区存储0.075(4字节)

这时我们想到了通过EIP寻址,也就是:

F3 0F 59 0D 02 00 00 00   ; mulss xmm1, [eip+0x2]
EB 04                     ; jmp short +0x4
9A 99 99 3D               ; 浮点数 0.075

这样我们就可以通过一个短跳巧妙地将代码区当做数据区使用。但是很遗憾的是,这个巧妙的方法超过了13字节。所以无法使用

一些我当时的想法:

能不能使用半精度(2字节)表示浮点数?答:不能,mulss只识别单精度、双精度

能不能不使用短跳直接通过设置四字节区域为“可读可写不可执行”,来确保这个4字节不被CPU当做指令执行?答:不行,内存权限的最小单位为“页”,如果设置为可读可写不可执行,与这四节同页的所有字节的权限都会被更改。

于是我们只好另寻出路了,直接从movss   xmm1, [ebp+arg_8]开始入手,直接将最终计算结果赋值给xmm1

最终计算结果就是我们想要控制的分离距离(真身与被击中回溯大于该距离,那么认定这个回溯无效)

于是我们直接修改内存为上图(push 40后esp会减少4【栈向内存低地址增长】,我们在数据加载完成后将esp+4恢复平衡【栈帧平衡】)

由于HVH中视角的判断不是很重要,所以我们直接取消下文逻辑

也就是说,如果在范围中返回1,不在范围内就返回中返回0

我们看到这里有一个setbe a1(根据标志位给al赋值)

我们知道一般来说eax是函数返回值所在的寄存器,而al是eax的低八位,所以这一步就是在设置返回值

因此我们将这之前的所有逻辑忽略掉(当然可使用jmp近跳转,我只是懒得算偏移了,所以直接全覆盖成NOP了)

然后我们将setbe al改为mov al, 0x0即可

为什么不直接覆盖到retn之前?答:在x86 msvc下 __thiscall当函数参数确定时,被调用者进行栈帧平衡(清栈)

如果我们将进行栈帧平衡的代码(图中浅蓝方框内)NOP掉,会导致栈错误,致使程序爆炸。

 

以上就是大概的修复思路了。当然SourceMod肯定是不能直接实现内存操作,所以我使用了Metamod。

插件下载:https://github.com/ELDment/Fucking_obliterated_CSGOs_clusterfuck_HVH-hostile_backtrack-system


CSGO插件分享-申明 1、本网站名称:CSGO插件分享-中文站  网址:https://bbs.csgocn.net
2、本站的宗旨在于为CSGO玩家提供一个插件分享的中文资源平台,多数插件来源于SourceMod论坛,并配以中文介绍和安装教程。
3、欢迎有能力的朋友共享有趣的CSGO插件资源。
4、本站资源大多为百度网盘,如发现链接失效,可以点: 这里进行反馈,我们会第一时间更新。
最新回复 (4)
返回