样本来自一个多开器外挂,启动并开启后可以重复开启游戏客户端。
分析后确定是通过关闭游戏进程的mutex实现的多开功能,也确定了游戏防止多开使用的是最常见的mutex方法。以下为对样本的分析过程。
运行程序
首先运行样本

开启成功

点击确定,主界面状态变化

载入样本

F9运行到主程序

查找字符串,在成功提示处下断点后运行,来到提示附近

往上翻看到启动器和游戏进程名

查看对应内存,除了游戏相关进程,还有一个Sessions\\1\\BaseNamedObJects\\COS。不知道是什么先放着,后来知道是一种常见防止多开的手段互斥量mutex。

开启多开后F8跟踪,运行该关键函数后多开生效

函数内容

继续跟踪进入缩小起效范围

在IDA查看该函数

参数lpWindowName为QQMicroGameBoxTray.exe

继续运行,findwindowA失败,之后通过获取程序快照的方式,从第一个进程开始比对


接着遍历快照中的进程,并将进程名与QQMicroGameBox.exe对比

在栈中观察被对比的进程名参数



直到出现了目标游戏盒子进程

和游戏进程比对后再次对比时process32next返回0,从而跳出循环去执行47d54e函数如图

打开QQMicroGameBox.exe并终止该进程

这时重复打开游戏登陆器成功,但重复登陆并不会多开,而是之显示旧的登陆界面
至此得知,函数sub_4cb9b实现了关闭指定进程,接下来样本对QQMicroGameBoxTray.exe执行了一样的查找并关闭操作至此处理完进程QQMicroGameBox.exe,接下来对进程QQMicroGameBoxTray.exe进行相同函数处理

接下来处理游戏进程CosClient.exe

结束Sessions\\1\\BaseNamedObJects\\COS,通过关闭游戏进程的mutex实现多开

之后会显示成功提示

此时重复打开游戏客户端成功

总结:使用mutex防止游戏被多开是最常用的一种简单方式,该游戏就是一个例子
参考资料: