首页 技术

简介

  • VAC(全名VALVE ANTI-CHEAT)是由VALVE Company(V协会)开发的防作弊系统。VAC是用于步进平台游戏的通用防作弊安全访问方案(DOTA2和CS:GO都使用VAC)。
    本文以CS:GO为分析对象,对CS:GO上采用的安全方案进行了基础分析。

1.分析结论

通过动态调试,静态分析和钩子验证,我们发现CS:GO上的VAC方案如下:
静态保护:

N-shell:所有PE文件均未封装
N代码混淆:无代码混淆
动态对抗:
N驱动器保护:未发现
N调试:简单异常干扰
N调试检测:简单调试检测
模块检测:
N窗口检测:找不到
N进程检测:枚举的进程模块行为
N线程检测:感知线程创建行为
N模块检测:找不到
N堆栈检测:堆栈回溯检测
N内存检测:未找到
其他:
N API:密钥API
N VAC2.DLL:嵌入式存储安全方案,但未加载到CS:GO中
N未打开检测:
U发现多个调试器检测
U发现多个堆栈检测
U发现游戏状态检测
注意:由于使用了单人战斗和离线分析,因此对游戏的分析是不完整的。

游戏结构分析

CSGO的游戏启动程序存储在根目录中,该目录中还包含与客户端相关的dll的步骤。Steam编译32位和64位版本。
请输入图片描述

游戏启动分析

CS:GO当前仅具有32位版本,全国统一将csgolauncher.exe替换为steam.exe,作为游戏启动器,游戏拉动过程如下:
请输入图片描述
Steam Web帮助程序仍使用chrome的CEF框架启动三个进程
请输入图片描述
游戏开始后,没有驱动程序加载,没有内核修改,没有全局挂钩设置。但是,该过程中有很多功能挂钩,包括加载类,文件操作类,与密钥相关的功能,Dx类API的挂钩,钩子跳转,ZwOpenFile被csgo.exe接管,其他功能则指向gameoverlayrender .dll

静态保护分析

在游戏中选择了重要的PE文件-csgo.exe,engine.dll,client.dll,server.dll,tier0.dll,tier0_s.dll未封装,IDA可以正常反编译。可以看出,VAC并未封装关键游戏模块,添加鲜花和其他常见的PE保护。

动态保护分析

没有反转储处理,游戏模块可以直接转储。
反向注入
无需反向注入,即可随意将模块注入游戏。
调试器附件
无需处理常见的断点API,调试器就可以任意附加,而不必担心附件。

驱动器保护和检测

Pchunter未在游戏中检测到VAC相关的驱动程序加载
Pchuner未检测到内核挂钩。
通过遍历目录
Hook ZwCreateFile未找到相关的驱动程序文件,未找到创建的驱动程序文件
Hook NtLoadDriver,未找到的驱动程序负载
Hook DeviceIoControl ,找不到驱动程序通讯
总之,VAC不使用驱动程序保护游戏,也不使用驱动程序进行检测。

调试器检测

通用API检测
Hook IsDebugger Present,检查Remote Debugger Present,认为游戏具有基本检测功能,tier0.dll,tier0_s.dll中的触发模块
请输入图片描述
确实可以通过调用一个简单的api来检测游戏,但是对于具有许多插件的32位OD,这种检测的意义和效果不是很大。

硬件断点检测

挂钩NtGetContextThread,NtSetContextThread,NtContinue,KiUserException Dispatcher。找不到与Dr寄存器相关的检测。
调试器功能检测
文本暴力搜索IDA,ollydbg,windbg,CE,_Plugingetvalue
字符搜索,例如_ODBG_Plugininit …尚未找到相应的文本。

异常检测

删除调试器的反调试功能,并发现进入游戏时,调试器会从游戏接收到异常通知。
请输入图片描述

跟踪异常触发点,以确认tier0_s.dll中
请输入图片描述
会主动引发异常。交叉引用游戏主动引发异常,发现除此之外,还有很多会引发异常
请输入图片描述

在游戏过程中,某些异常会被被动触发,如下所示,
请输入图片描述

这些异常处理可以被调试器忽略或被插件绕开。

窗口检测

常规形式的枚举

尚未找到包含EnumWindows,FindWindow,EnumChildWindows的Hook通用枚举窗口api,它们无法检测到Windows
进一步深入的钩子,钩子Enmu Windows底层实现API:
_内部EnumWindow,_BuildHwndList,_NtUserBuildHwndList也未发现异常调用。
窗口和类名的枚举:
钩子GetClassNameA,GetWindows TextA验证游戏是否通过A系列的类函数获得了类的名称,但没有察觉到函数调用。

触发的窗口检测

监视关键api:SetWindows HookEx,SetEventHook,未找到相关的函数调用
总之,VAC不使用常见的窗口检测方法来检测可疑模块。

进程检测

常规枚举过程

  • ToolsHelp接口枚举:
    挂钩api:CreateToolhelp32Snapshot,Process32First,Process32Next,steamclient.dll定期枚举所有进程

请输入图片描述

  • Psapi接口枚举:钩子EnumProcesses,EnumProcess模块,GetModuleFileNameEx:
    Steamclient.dll枚举进程

请输入图片描述

  • Psapi接口枚举:钩子EnumProcesses,EnumProcess模块,GetModuleFileNameEx:
    Steamclient.dll枚举进程

请输入图片描述

  • Wtsapi32接口枚举:
    未检索WTSOpenServer,WTSEnumerateProcess的相关函数调用

4.本机API枚举:NtQuery系统信息,ZwQuery系统信息的钩子
跟踪到Steamclient中模块中

请输入图片描述

枚举的调用句柄枚举过程
1.暴力句柄的枚举,OpenProcess + GetProcessImageFileName
不受监视的相关调用
2.常规枚举,ZwQuery系统信息
使用enumprocess监视和跟踪Steamclient。3
.其他进程枚举句柄,OpenProcess + GetProcessImageFileName / GetProcessId
来自游戏模块的不受监视的可疑调用
驱动器枚举
VAC卸载驱动程序,不太可能进行这种类型的检测
触发的枚举
VAC没有安装全局钩子。这种检测是不可能的。
总而言之,类似于dota2中的先前安全方案,VAC是通过感知模块创建的,并最终调用ZwCreateFile和GetFile Information ByHandle进行文件信息报告。

请输入图片描述

模块检测

1.传统模块枚举:

钩子创建工具help32Snapshot,Module32First,Module32Next,Heap32First,GetModuleBaseName
找不到相关调用

2.遍历PEB模块:

钩住ZwQuery Information Process,未找到来自游戏模块的直接调用。




文章评论

    ckk 访客ChromeWindows
    2020-12-2 15:20   回复

    测试评论

    晨曦 站长ChromeWindows
    2020-12-2 15:20   回复

    测试评论

目录