调试通过关闭mutex实现多开的外挂样本
样本来自一个多开器外挂,启动并开启后可以重复开启游戏客户端。
分析后确定是通过关闭游戏进程的mutex实现的多开功能,也确定了游戏防止多开使用的是最常见的mutex方法。以下为对样本的分析过程。
运行程序
首先运行样本
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304914-494007612.png)
开启成功
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305014-760393100.png)
点击确定,主界面状态变化
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304916-1120003681.png)
载入样本
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304974-1276100030.png)
F9运行到主程序
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304986-1067480834.png)
查找字符串,在成功提示处下断点后运行,来到提示附近
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305074-818407567.png)
往上翻看到启动器和游戏进程名
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304965-935664141.png)
查看对应内存,除了游戏相关进程,还有一个Sessions\\1\\BaseNamedObJects\\COS。不知道是什么先放着,后来知道是一种常见防止多开的手段互斥量mutex。
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305041-1181198387.png)
开启多开后F8跟踪,运行该关键函数后多开生效
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304966-1066793595.png)
函数内容
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304989-540892666.png)
继续跟踪进入缩小起效范围
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304933-1462367319.png)
在IDA查看该函数
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304945-904911359.png)
参数lpWindowName为QQMicroGameBoxTray.exe
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304929-386291029.png)
继续运行,findwindowA失败,之后通过获取程序快照的方式,从第一个进程开始比对
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304915-1441687823.png)
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304914-2137392267.png)
接着遍历快照中的进程,并将进程名与QQMicroGameBox.exe对比
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304941-303029083.png)
在栈中观察被对比的进程名参数
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304942-1783935969.png)
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305014-1122942201.png)
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304914-948950276.png)
直到出现了目标游戏盒子进程
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304934-1623076685.png)
和游戏进程比对后再次对比时process32next返回0,从而跳出循环去执行47d54e函数如图
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304962-741399111.png)
打开QQMicroGameBox.exe并终止该进程
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305044-1597049709.png)
这时重复打开游戏登陆器成功,但重复登陆并不会多开,而是之显示旧的登陆界面
至此得知,函数sub_4cb9b实现了关闭指定进程,接下来样本对QQMicroGameBoxTray.exe执行了一样的查找并关闭操作至此处理完进程QQMicroGameBox.exe,接下来对进程QQMicroGameBoxTray.exe进行相同函数处理
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305070-1929626726.png)
接下来处理游戏进程CosClient.exe
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304939-516267573.png)
结束Sessions\\1\\BaseNamedObJects\\COS,通过关闭游戏进程的mutex实现多开
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304959-426879360.png)
之后会显示成功提示
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174305041-618887250.png)
此时重复打开游戏客户端成功
![](https://img2020.cnblogs.com/blog/1166397/202106/1166397-20210617174304989-612002932.png)
总结:使用mutex防止游戏被多开是最常用的一种简单方式,该游戏就是一个例子
参考资料: