游戏多开检测的几种实现方法及破解方法参考

14 篇文章 8 订阅

目录

枚举进程的多开检测

互斥对象多开检测

信号量多开检测 

窗口多开检测

共享内存检测多开

示例代码汇总


游戏多开检测只是对游戏的进程数进行限制,分为事前检测、事中检测、和事后检测。

事中检测和事后检测往往没有提示,是游戏公司封号、处罚的手段,事前检测即禁止游戏多开,本文介绍常见的几种禁止游戏多开的方法,并给出破解方法,仅供参考。

枚举进程的多开检测

基本原理就是枚举所有系统进程,如果发现游戏进程名已经存在则无法继续打开新的进程。

bool isMulOpenByProcess()
{
	HANDLE hProShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	if (hProShot == INVALID_HANDLE_VALUE) return false;
	PROCESSENTRY32 pw{ sizeof(pw)};

	int count = 0;
	BOOL  bRet = Process32First(hProShot, &pw);
	if (!bRet) return false;
	do{

		_wcslwr_s(pw.szExeFile, wcslen(pw.szExeFile) + 1);
		if (wcscmp(pw.szExeFile, L"muldectection.exe") == 0) count++;
		//wprintf(L"%s\n", pw.szExeFile);
	} while (Process32Next(hProShot, &pw));

	if (count > 1) return true;

	return false;
}

参考破解方法—程序运行时修改进程名 

互斥对象多开检测

互斥对象是内核对象,当创建带名称的互斥对象时,如果该互斥对象存在,则创建失败。可以利用这一点实现躲开检测。

bool isMulOpenByMutex()
{
	HANDLE hMutex = CreateMutexA(NULL, FALSE, "MulDectection");
	if (ERROR_ALREADY_EXISTS == GetLastError()) return true;
	
	return false;
}

参考破解方法—可以在PE文件结构中删除互斥对象的句柄;hook CreateMutexA函数 等

信号量多开检测 

信号量是内核对象,同互斥对象的原理类似,创建信号量时可以指定信号量的最大数量,程序运行时,可以让信号量加一,如果没法加一,说明信号量数量达到了设置最大值,以此来进行躲开检测

bool isMulOpenBySemaphore()
{
	HANDLE hSema;
	hSema  = OpenSemaphoreA(SEMAPHORE_ALL_ACCESS, FALSE, "MulDectection");
	if (!hSema) 
		hSema =  CreateSemaphoreA(NULL, 0, 3, "MulDectection");

	if (!ReleaseSemaphore(hSema, 1, 0)) return true;
	return false;
}

 参考破解方案——可以调用WaitForSingleObject减少信号量数量

窗口多开检测

程序运行时寻找是否有同名窗口,如果已经存在则为程序多开。

HWND hWnd=FindWindowA(NULL,"ConsoleWindowClass");
	if (hWnd != NULL) return true;

参考破解方案——修改窗口名

共享内存检测多开

通过进程间共享内存段的方式来检测多开 

#pragma data_seg("_hdata")
int g_count = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:_hdata,RWS")

bool isMulOpenByMemory()
{
	g_count++;
	if (g_count > 1)return true;

	return false;
}

参考破解方案——修改共享内存段的变量的值

示例代码汇总

#include<Windows.h>
#include<iostream>
#include<tlhelp32.h>

#pragma data_seg("_hdata")
int g_count = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:_hdata,RWS")

bool isMulOpenByProcess()
{
	HANDLE hProShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	if (hProShot == INVALID_HANDLE_VALUE) return false;
	PROCESSENTRY32 pw{ sizeof(pw)};

	int count = 0;
	BOOL  bRet = Process32First(hProShot, &pw);
	if (!bRet) return false;
	do{

		_wcslwr_s(pw.szExeFile, wcslen(pw.szExeFile) + 1);
		if (wcscmp(pw.szExeFile, L"muldectection.exe") == 0) count++;
		//wprintf(L"%s\n", pw.szExeFile);
	} while (Process32Next(hProShot, &pw));

	if (count > 1) return true;

	return false;
}

bool isMulOpenByMutex()
{
	HANDLE hMutex = CreateMutexA(NULL, FALSE, "MulDectection");
	if (ERROR_ALREADY_EXISTS == GetLastError()) return true;
	
	return false;
}

bool isMulOpenBySemaphore()
{
	HANDLE hSema;
	hSema  = OpenSemaphoreA(SEMAPHORE_ALL_ACCESS, FALSE, "MulDectection");
	if (!hSema) 
		hSema =  CreateSemaphoreA(NULL, 0, 3, "MulDectection");

	if (!ReleaseSemaphore(hSema, 1, 0)) return true;
	return false;
}

bool isMulOpenByFindWindow()
{
	HWND hWnd=FindWindowA(NULL,"ConsoleWindowClass");
	if (hWnd != NULL) return true;

	return false;
}

bool isMulOpenByMemory()
{
	g_count++;
	if (g_count > 1)return true;

	return false;
}
int main()
{
	if (isMulOpenByMemory())
	{
		MessageBoxA(NULL, "程序禁止多开", "MulDectection", MB_OK);
		return -1;
	}
		
	MessageBoxA(NULL, "打开成功!", "MulDectection", MB_OK);
	return 0;
}

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
游戏通用多开器.zip是一个压缩文件,其中包含了一个游戏通用多开器软件。多开器的作用是允许玩家同时运行多个相同或不同的游戏客户端,从而实现同时进行多个游戏的效果。 这个多开器软件有很多使用场景和功能。首先,对于喜欢同时在多个游戏中进行切换的玩家来说,多开器允许他们在不需要登出一个游戏的情况下立即开始另一场游戏,提高了游戏的效率和趣味性。其次,如果玩家需要在一个游戏中使用多个角色进行操作,多开器也能提供这个功能。同时,多开器还允许玩家在同一台电脑上多开多个不同的游戏,方便整合各种游戏资源和玩法。 使用游戏通用多开器.zip也相对简单。首先,解压缩文件,将其中的多开器软件安装到电脑中。然后,打开软件并跟随指示进行设置,如选择要运行的游戏客户端、设置运行时的参数等。在设置完成后,点击运行按钮即可同时开启多个游戏客户端。 需要注意的是,使用多开器软件时要注意自己电脑的硬件资源。多个游戏同时运行会占用大量的内存和处理器资源,如果电脑性能不足,可能会导致游戏卡顿或崩溃。另外,一些游戏开发商可能不允许使用多开器软件,因此在使用之前最好了解游戏的使用协议和规定,以避免违规行为带来的风险。 总之,游戏通用多开器.zip是一个帮助玩家同时运行多个游戏客户端的软件。它提供了便捷的多游戏操作和多角色操作功能,并通过合理设置来充分利用电脑的硬件资源。使用前需了解游戏规定,以确保符合相关规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员陈子青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值