CS2外部静默原理剖析及实现




前言


现在CS2外挂层出不穷,基本大部分的外挂功能都已被实现,其中在我研究过程中比较有意思的就是外部静默自瞄。当然静默自瞄在注入游戏后是很容易实现的,只需要Hook CreateMove这个函数进行拦截CMD这个结构数据,然后进行视角的修改即可,但外部比较难实现这种方法,但也可以从此函数入手来研究,所以就有接下来的分析过程。

注:此文章仅分享逆向过程以供学习参考,并无传播、提供外挂等非法程序。





分析


静默原理


由于游戏是3D世界,所以方向大部分是用欧拉角来表达,即Pitch(俯仰角)、Yaw(偏航角)、Roll(翻滚角)三个数据,静默就是修改开枪旋转角,在本地相机旋转角不变的情况下修改开枪旋转角,就可以实现不瞄准目标但又可以射击到目标的功能。
CS2外部静默原理剖析及实现

而在CS2中CreateMove函数参与移动相关的所有操作,例如:相机旋转角改变、人物移动、人物动作等等。

函数原型如下:

bool __fastcall CreateMove(CCSGOInput* pInput, int slot, unsigned __int8 a3)
{
// ...
}

其中”CCSGOInput”类包含了所有相关数据,具体实现功能就是拦截并修改此指针数据,所以我的入手点就在这个函数。

寻找CreateMove函数


首先使用IDA分析”client.dll”此文件,在String窗口中直接搜索”CreateMove”,可以在String窗口看到这些文本。

CS2外部静默原理剖析及实现

选中第二个,查看交叉调用可以发现有且仅有一个函数。

CS2外部静默原理剖析及实现

这个函数就是CreateMove。

CS2外部静默原理剖析及实现


动态调试CreateMove函数


静默最主要的数据就是相机的旋转角数据,因为开枪的旋转角与相机旋转角数据一致,注:Rotation{Pitch,Yaw,Roll},所以先去Github上的cs2-dumper项目中找到ViewAngle的地址,添加到CE以便对照寄存器数据进行调试定位。

CS2外部静默原理剖析及实现

然后在Memory Viewer里面跳转到CreateMove函数,直接下断F8单步走一遍,过程中打开着FPU窗口观察XMM寄存器数据,因为旋转角数据是浮点数,所以在调试代码过程中观察是否能看到旋转角相关数据,就可以快速定位相关代码段,发现在这行汇编代码后的一片地址都没有执行过。

CS2外部静默原理剖析及实现

所以我们直接略过下面一片代码,直接跟着跳转过去继续单步执行下去。

当执行完这个Call后,XMM1寄存器出现了一个熟悉的数据。

CS2外部静默原理剖析及实现

可以和旋转角数据对照,发现是相机的Yaw数据。

CS2外部静默原理剖析及实现

这个Call有点嫌疑,直接NOP后,在游戏中开枪,发现射出的子弹方向和实际相机方向不一致。

CS2外部静默原理剖析及实现

基本可以确定开枪角度的写入是在这个Call内部,所以打标签记录一下这个函数,直接跳转到函数内部进行继续分析。(这个函数后面发现是之前IDA String列表的第一个文本交叉调用中的函数。注:图三

开着寄存器窗口继续F8单步走跟代码,跟到这一行代码发现XMM0首次出现了Pitch数据,与我们ViewAngle的数据一致。

CS2外部静默原理剖析及实现

继续执行后可以看到XMM0、XMM1分别就是旋转角Pitch和Yaw。

CS2外部静默原理剖析及实现

所以就可以确定是上面这两个关键代码获取到旋转角数据,并分别赋值给[rcx+18]和[rcx+1C],可以猜测下一个的XMM0赋值代码便是Roll数据,但是Roll数据一般是0,所以这里不讨论下面部分的代码。所以就可以在这附近进行拦截修改rcx相关寄存器地址的值,达到修改开枪角度的效果,下面进行验证。

简单Hook验证


我们在0x87C37C偏移处进行简单的Hook来验证,看看修改[rcx+18]以及[rcx+1C]后是否能成功修改开枪视角。这里先直接使用CE的自动汇编来快速的写一个Hook脚本,将[rcx+18]以及[rcx+1C]拦截修改为[newmem+50]和[newmem+54]两个地址的浮点值。

CS2外部静默原理剖析及实现

执行脚本后射击发现子弹射击角度和相机角度不一致,修改[newmem+50]以及[newmem+54]后发现可以正确的修改子弹射击角度,那就可以确定这是我们所需要的效果。

CS2外部静默原理剖析及实现

在线游戏验证效果


我和好友在人机房间进行测试,让好友看我观战视角,然后我这边启动Hook脚本,发现在线观战是有效果的,并且在其他玩家的第三人称视角也是有效果的,在其他视角我的人物开枪方向和实际子弹射出方向不一致,由此可得出结论此功能效果是在线有效,而并非仅本地有效。




总结


这次逆向过程总的来说较为流畅,过程不复杂但是比较考验观察能力,对我来说也是一次不错的体验,第一次发贴不太熟练,文章有什么文本错误或技术解释错误请指出,我会及时修改,希望以上逆向过程对大家有所启发以及帮助。



CS2外部静默原理剖析及实现


看雪ID:Liv_T

https://bbs.kanxue.com/user-home-977625.htm

*本文为看雪论坛优秀文章,由 Liv_T 原创,转载请注明来自看雪社区

CS2外部静默原理剖析及实现



# 往期推荐

1、Alt-Tab Terminator注册算法逆向

2、恶意木马历险记

3、VMP源码分析:反调试与绕过方法

4、Chrome V8 issue 1486342浅析

5、Cython逆向-语言特性分析


CS2外部静默原理剖析及实现


CS2外部静默原理剖析及实现

球分享

CS2外部静默原理剖析及实现

球点赞

CS2外部静默原理剖析及实现

球在看



CS2外部静默原理剖析及实现

点击阅读原文查看更多

原文始发于微信公众号(看雪学苑):CS2外部静默原理剖析及实现

版权声明:admin 发表于 2024年8月8日 下午6:00。
转载请注明:CS2外部静默原理剖析及实现 | CTF导航

相关文章