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
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |