一.从生命周期的角度看游戏的多开检测
0x0 事前检测
当你启动第二个游戏的瞬间阻止你这个行为,防患于未然。
特点:不会涉及到封号,这是人为的一个功能。
0x1 事中检测
在游戏运行的过程中进行悄咪咪的检测
特点:没有任何提示,会导致封号
0x2 事后检测
基于数据的检测,你登录了游戏,一定会暴露登录IP等信息。同一个IP下有多台电脑,那一定属于多开行为
二.从技术原理的角度看游戏的多开检测
0x0 进程枚举多开检测方案
直接调用现成的库或者自己去研究实现原理
#include <TlHelp32.h>
CreateToolhelp32Snapshot()
Process32First()
Process32Next()
ExitProcess()
攻击方案: 复制PE文件,然后进行重命名
0x1 互斥量多开检测方案
CreateMutexA()
攻击方案: 待研究
0x2 信号量多开检测方案
信号量特点:在不同进程间能够共享数据资源
OpenSemaphoreW()
CreateSemaphoreW()
ReleaseSemaphore()
攻击方案: 自己领悟
0x2 窗口多开检测方案
特点:需要在窗口没有出现之前执行,否则把自己给检测到了
FindWindow()
SetWindowTextW()
0x2 共享内存检测方案
特点:实现进程间通信的一种手段(常规状态下,每个程序的内存空间是独立的,不能相互访问)
#pragma data_seg("_hdata") //告诉编译器这个数据放在"_hdata"节的地方
int game_count = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:_hdata,RWS")//READ WRITE Share
三.实战
寻找切入点:对开检测算法会放在哪个时间段执行呢?
通过观察猜测是在游戏启动前进行检测的
通过逆向分析和排除法,最终定位到了检测算法的地址 0x409322