破解QQ游戏大厅多开限制
QQ游戏有一个限制,就是一个电脑上不让多开多个游戏大厅,防止本地的刷分,今天心血来潮想研究一下,就试试看能不能搞定它,用的工具是大名鼎鼎的IDA,用它可以单步跟踪调试。
先说说步骤吧,步骤挺简单的,IDA有一个图形方式,点单步跟踪下来,看看大概流程,需要说明的是,根据很多信息表明,QQ游戏是使用MFC写的,并且代码里有一个明显的WinMain的入口,这里就是最基本的突破点。
先开一个大厅,跟踪一次,再关闭原来的大厅,只开一个实例跟踪一次,结果就能大概判断出来流程的差异,并找到检测是否躲开的入口函数,一步步单步跟踪,基本上就是在每个call的位置设断点,就可以找到最关键的部分。
最关键的部分是什么呢,这里稍微介绍一点关于防止多实例的办法:
1、通过枚举进程的方法检查;
2、通过FindWindow查找窗体类检查;
3、通过CreateMutex建立内核对象检查。
方法1:检查进程,然后判断是否有重名的进程,此方法相当不可靠最容易破解,通常不会采用,并且枚举进程在不同系统上API差别比较大,通常不会用这样的方法。
方法2:FindWindow,这是很常用的一种方法,但是通过分析QQ游戏发现,QQ游戏窗口的窗体类名不同版本并不一样,所以估计腾讯使用这种方法防止多实例比较麻烦
方法3:这种方法是建立一个内核对象,如果内核对象已经存在,那么在创建以后马上使用GetLastError检查的话,会返回一个ERROR_ALREADY_EXIST,十六进制值是0xB7,这种方法很通用,而且不同Windows版本基本上都支持,是一种很好的方法。
在破解之前,显然不知道QQ游戏使用哪种方法,所以,单步跟踪的时候都要注意,方法1的一个办法就是在QQ游戏启动以后看看是否加载了psapi.dll这个库,如果没有,就不会,另外两个方法可以在kernel32.dll和user32.dll里增加断点来实现。
实际调试表明,腾讯使用第三种方法,它的检查函数位于Utility.dll里,在我使用的这个版本里,反汇编内容如下:
.text:10012F3C&&&&&&&&&&&&&&&&
ds:CreateMutexA
.text:10012F42&&&&&&&&&&&&&&&&
test&&& eax,
.text:10012F44&&&&&&&&&&&&&&&&
[esi+4Ch], eax
.text:10012F47&&&&&&&&&&&&&&&&
short loc_10012F6D
.text:10012F49&&&&&&&&&&&&&&&&
ds:GetLastError
.text:10012F4F&&&&&&&&&&&&&&&&
.text:10012F54&&&&&&&&&&&&&&&&
.text:10012F56&&&&&&&&&&&&&&&&
short loc_10012F5F
这里用了一个很“标准”的方法:CreateMutex然后GetLastError,如果返回值等于0xB7则跳转到某个地址返回。
所以,索性全部改掉它,jnz的意思是,如果不相等,就跳转到某地址,那么,也不要判断相等不相等了,把012F5E全部改成nop(0x90)就没有问题了。
实验证明此种方法可行,并且没有什么副作用。
分析到此为止,为什么网上有那么多的多开补丁存在,确实腾讯使用的这种方法是比较简单的,也容易被破解。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。