OK,该反作弊系统使用应用层检测+驱动层检测,进入CSGO对战后观察pchunter,发现反作弊驱动cheano_drv.sys,截图如下:
用魔盾分析一下,发现有ObRegisterCallbacks、ObUnRegisterCallbacks、321000,就代表有内核回调函数进行句柄监视,截图如下:
OK,我们回到pchunter查看,发现的确有相关回调,截图如下:
OK,我们现在要看看这个反作弊系统的基本运行行为,所以我就尝试挂钩做一下监听
挂钩了NtCreateFile、NtDeviceIoControlFile、NtQuerySystemInformation(懂了人自然懂,当然还可以挂钩其它函数,例如注册表相关),源码如下:
[C++] 纯文本查看 复制代码 typedef NTSTATUS(*F_NtCreateFile)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG);
F_NtCreateFile f_NtCreateFile = 0;
NTSTATUS MyNtCreateFile(
PHANDLE FileHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PIO_STATUS_BLOCK IoStatusBlock,
PLARGE_INTEGER AllocationSize,
ULONG FileAttributes,
ULONG ShareAccess,
ULONG CreateDisposition,
ULONG CreateOptions,
PVOID EaBuffer,
ULONG EaLength)
{
if (PsGetCurrentProcessId() == m_pid)
log("NtCreateFile : %wZ", ObjectAttributes->ObjectName);
return f_NtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);
}
typedef NTSTATUS(*F_NtDeviceIoControlFile)(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, ULONG, PVOID, ULONG, PVOID, ULONG);
F_NtDeviceIoControlFile f_NtDeviceIoControlFile = 0;
NTSTATUS MyNtDeviceIoControlFile(
HANDLE FileHandle,
HANDLE Event,
PIO_APC_ROUTINE ApcRoutine,
PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock,
ULONG IoControlCode,
PVOID InputBuffer,
ULONG InputBufferLength,
PVOID OutputBuffer,
ULONG OutputBufferLength)
{
if (PsGetCurrentProcessId() == m_pid)
log("NtDeviceIoControlFile : %d", IoControlCode);
return f_NtDeviceIoControlFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, IoControlCode, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength);
}
typedef NTSTATUS(*F_NtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
F_NtQuerySystemInformation f_NtQuerySystemInformation = 0;
NTSTATUS MyNtQuerySystemInformation(
SYSTEM_INFORMATION_CLASS SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength)
{
if (PsGetCurrentProcessId() == m_pid)
log("NtQuerySystemInformation : %d", SystemInformationClass);
return f_NtQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
}
准备完毕之后,我登陆平台,进入CSGO的娱乐模式,然后退出游戏,退出平台,就得到了2000多条的调用记录,截图如下:(可能排位模式会有所不同,待测试)
OK,现在我们就可以慢慢分析这个反作弊系统的一些行为了
因为数据比较多,所以我就分析几条重要的,其余的留给你们自己分析
1.使用NtQuerySystemInformation函数遍历驱动、进程、模块信息,针对这个我们可以Hook,隐藏我们不想被它遍历到的驱动和进程
62和63就是遍历进程的DLL模块,11就是遍历系统加载的驱动程序,5就是遍历系统内运行的进程,还有一些有意思的数字你们自己去分析,比如说反调试,截图如下:
2.大量使用命名管道进行一些通信,例如\??\pipe\mojo.xxxxxx,我们可以选择性的截断一部分通信,看看对游戏正常运行是否有什么影响,截图如下
3.进过观察发现最主要的一点,启动游戏有一个Code是4655111,然后结束游戏后有一个Code是4655116,初步判断,它们是反作弊系统的启动检测和停止检测相关,
然后我们游戏开始的时候就替换为4655116,那就代表反作弊的主要检测功能不工作,截图如下:
OK,到这里就差不多了,初步的解决方案就是 :
1.替换反作弊驱动cheano_drv.sys内的回调函数地址,修改为我们的内核回调函数地址,让它的句柄监视无效,能够任意读写游戏内存
2.过滤命名管道的通信,尽可能多的阻断与进程或者内核的通信(主程序下有多个子程序,应当是跨进程通信相关)
3.一直修改为4655116,让反作弊系统的检测不工作
4.Hook住NtQuerySystemInformation函数,过滤掉我们自己的辅助程序和读写驱动,实现隐身
5.Hook住NtCreateFile函数,将尝试读取我们文件的操作全部阻断掉,二次防护
最后放上Log文件让你们自己去分析
5E分析.txt
(191.11 KB, 下载次数: 160)
|