全面分析游戏限制多开原理

转载一篇他人的优秀文章,另外加入了一些自己的见解 _(´ཀ`」∠)_加班

1,进程

现象:
游戏通过探测游戏客户端进程是否已经存在来防止重复打开。

破解方法:
(1)隐藏进程。可以用工具 HideToolz,也可以自己写驱动简单的做个摘链隐藏。
(2)hook 游戏遍历进程的 api。

  • CreateToolhelp32Snapshot()、Process32First()和Process32Next()
  • EnumProcesses()、EnumProcessModules()、GetModuleBaseName()
  • ZwQuerySystemInformation
  • WTSOpenServer()、WTSEnumerateProcess()

(3)修改进程名。拷贝一份游戏 exe 文件的副本,重命名即可。


2,窗口标题

现象:
游戏通过探测游戏客户端的窗口是否已经存在来防止重复打开。

破解方法:
(1)使用 SetWindowText 修改窗口标题,可以自己调用或 hook 游戏的都可以。
(2)hook 游戏的 FindWindow ,不让其获取其他游戏的窗口句柄。
(3)hook 游戏的 EnumWindows ,不让其遍历窗口。


3,端口

现象:
游戏通过默认打开TCP或者UDP端口监听。

破解方法:
端口隐藏(端口复用)


4,独占文件、公共文件
现象(公共):游戏启动后会以独占方式打开某个文件的(lockfile)文件句柄,当第二次再有程序打开它时就会报错。
现象(独占):游戏启动后用刀的所有文件(dll,ini 等)都使用独占方式打开,当第二次再有程序打开它时就会报错。

破解方法:
(1)hook 游戏的 OpenFileMapping,拷贝一份独占文件副本并重命名,让他获取文件副本的句柄而不是原文件句柄。
(2)循环遍历游戏的句柄表,删除指定的 File 类型的句柄


5,多个操作系统账号
现象:游戏通过限制一个用户只能打开一个游戏来防止重复打开。

破解方法:
创建多个系统账号后,Shift + 右键 ,以其他身份运行。


6,互斥体
现象:游戏只能单开,通过互斥对象/信号量/事件等线程同步对象来确定程序是否已经运行。

破解方法:
(1)Hook 对应创建互斥体的 API
(2)循环遍历游戏句柄表,删除对应的句柄


7,内存映射文件
现象:游戏只能开2个、3个等。而不是只能开1个,通过把程序实例信息放到跨进程的内存映射文件中,防止游戏多开。

破解方法:
(1)Hook CreateFileMapping 、OpenFileMapping
(2)循环遍历游戏句柄表,删除对应的句柄


8,DLL全局共享变量
现象:游戏只能开2个、3个等。而不是只能开1个 ,DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。

破解方法:
(1)找到共享区段的位置,使用 PE 工具删除这个区段。
(2)使用 ce 找到存放游戏实例的基地址,每当启动一个实例后,使用 WriteProcessMemory 修改这个值。


9,Mac地址验证
现象:游戏只能开2个、3个等。而不是只能开1个 ,登陆服务器时,获取本机mac地址,发送至服务器端,服务端进行mac地址验证,如果mac地址重复登陆,则不允许同服务器进行消息传递。

破解方法:
(1)hook 游戏获取 mac 的 api ,让每个游戏获取不同的 mac 地址。注意游戏可能会多次获取 mac ,所以不要将 mac 完全随机,避免第一次获取的 mac 和第二次获取的 mac 不一样,这就很尴尬。处理方法是 dll 注入时初始化一个随机 mac ,之后 hook 时都使用这个 mac 来伪造。
(2)定时修改本机mac 。这种情况有一个缺陷,就是必须把时钟设置的很小,因为游戏不一定只有登录时才校验 mac ,如果游戏对 mac 做循环校验,就必须保证在打开的 n 个游戏的 n 个循环中 ,都修改一次 mac 。也就是说,打开的客户端也多,修改本机mac 的时钟就要设置的越小,且不能保证某一时刻客户端 a 和 客户端 b 获取到的mac 是相同的 !


10,查看网络连接
现象:获取本机所有网络连接,使用 GetTcpTable 获取 TCP 连接,使用 GetUdpTable 获取 UDP 连接,检查是否有连接到服务器IP和端口号的连接,如果有,表示程序已经启动,否则程序未启动。

破解方法:
hook GetTcpTable 、GetUdpTable

猜你喜欢

转载自blog.csdn.net/Simon798/article/details/113122624