QQ游戏多开

这两天同学想我帮他让qq游戏双开,这样玩斗地主等游戏都可以用马甲号起到一定的作弊作用。我跟他说,一般程序的为了保证仅有一个实例运行的办法是使用多线程课上讲过的那个互斥量(createmutex),所以双开的办法,就是反汇编程序找到这段代码修改一下。他听着也半信半疑,说网上看到的一些文章也这么说,但不知道具体怎么弄。

我就让他把那篇文章发过来我看看,看了一些发现还是很简单的,文章中说的方法是用w32dasm这个反汇编工具反汇编qqgame.exe,然后根据输入函数找到createmutex的位置再用十六进制编辑器UltraEdit-32找到刚刚的程序段,修改createmutex使用后的一个判断跳转。jne–>jmp。于是我就照着这个文章说的开始弄,结果反汇编qqgame.exe从输入函数中却找不到createmutex函数。可能是因为刚刚看的那篇文章比较早的原因,QQgame现在可能已经更新了不知道多少代了,方法也应该更新了。

看了输入函数中还有检测进程的API,猜测可能是在运行前检测是否已经有QQgame.exe存在,若存在就认为已经有一个实例不再运行。于是就开始用OD直接动态调试QQgame.exe了,可是一运行就异常退出了,估计QQgame.exe用了点反调试技术,就单步重新运行,结果跟到一个createsnapshot的api里就又蹦了,细一看,原来进入该api后有

mov dword ptr ds:[0],0

看来QQgame.exe修改了所有导入的api函数的头几个字节,让所有api默认情况下都产生异常。随便修改了一下这个exe,加了句int 3,重新运行QQ崩溃,但却不像其他软件崩溃时产生发送错误对话框,同时允许调试器加载调试,而是产生一个qq特有的异常界面。这才想起来,每次QQ崩掉的时候都是它自己特有的错误对话框出来。换句话说,QQgame为程序中各种错误都增加了自己的异常处理函数,让任何错误都不会运作到进程默认的那个异常处理函数。这样就不太好办了,除非我自己恢复那些api函数的头几个字节,不让那些api产生异常,否则是没办法调试下去了。

后来又上网查了一下相关的文章,发现有人发布的双开补丁是针对一个dll文件的,看来新的QQ检测双开的函数不再放到主程序中了,而是让动态链接库来完成,这下就简单多了。找到common/utility.dll找到createmutex程序段,一共有五个,但是对返回结果进行判断的就一个,直接修改跳转(跟爆破差不多)。就解决了。