找回密码
 加入
搜索
楼主: ceoguang

[系统综合] 关于防多开类游戏,高分悬赏C TO A 的代码转换

 火.. [复制链接]
发表于 2010-8-23 23:24:07 | 显示全部楼层
LS 不要这样一分钟连发3贴吧,论坛的资源不是无限的…
 楼主| 发表于 2010-9-3 03:45:20 | 显示全部楼层
感谢大家的关注
经过多日的研究,似乎关闭MuTex不是一个好办法.因为某些进程即使关闭句柄了也是无效的.
之前跟snow研究了一下,使用远程注入去勾MuTex.
因为autoit远程挂勾API难度实在太大了,所以到最后还是得用VC来解决.
附一个在官方找到的代码,详见4#
欢迎有能力之士继续关注.
发表于 2010-9-14 18:41:16 | 显示全部楼层
测试4#的代码系统OVER了,弹出一个错误对话框,没等点击就关机了,貌似几个系统关键进程出现了问题。

关闭远程进程中的句柄根本不需要HOOK,DuplicateHandle如果不能实现这个功能的话,那它就不强大了。

枚举句柄可以参考一下Thread.au3中的_RTEnumerateHandles,可以指定参数,用于标识枚举哪个进程中的句柄。
既然楼主兄独立思考过了,那就把解决方案贴出来。以下这段代码可以实现QQGame的无限多开。
#include <Thread.au3>

Const $tagSYSTEM_HANDLE_INFORMATION = "ulong ProcessId;ubyte ObjType;ubyte Flags;ushort Handle;ptr Object;dword DesiredAccess"

$aProcess = ProcessList("QQGame.exe")
If ($aProcess[0][0]) Then
        For $i = 1 To $aProcess[0][0]
                Assign("~" & $aProcess[$i][1], _RTOpenProcess($aProcess[$i][1]))
        Next
Else
        Exit
EndIf

$sObjName = "\BaseNamedObjects\QQGame_Mutex03/01/2003"

$pBuffer = _RTHeapAlloc(1024)
_RTQuerySystemInformation(16, $pBuffer, 1024)
$iBuffer = @Extended
_RTHeapFree($pBuffer)

$pBuffer = _RTHeapAlloc($iBuffer)
_RTQuerySystemInformation(16, $pBuffer, $iBuffer)

$iNumberofHandles = _RTReadBytes($pBuffer)
$pBuffer += 4
$pObjName = _RTHeapAlloc(1024)

For $i = 1 To $iNumberofHandles
        $tBuffer = DllStructCreate($tagSYSTEM_HANDLE_INFORMATION, $pBuffer + ($i - 1) * 16)
        If Not IsDeclared("~" & DllStructGetData($tBuffer, "ProcessId")) Then
                $tBuffer = 0
                ContinueLoop
        EndIf
        $hProcess = Eval("~" & DllStructGetData($tBuffer, "ProcessId"))
        $hHandle = DllStructGetData($tBuffer, "Handle")
        $hDup = _RTDuplicateHandle($hProcess, $hHandle, -1)
        If _RTQueryObject($hDup, 1, $pObjName, 1024) Then
                If _RTInitBufferExW($pObjName) = $sObjName Then
                        _RTCloseHandle($hDup)
                        _RTCloseHandle(_RTDuplicateHandle($hProcess, $hHandle, -1, 1))
                        ExitLoop
                EndIf
        EndIf
        _RTCloseHandle($hDup)
        $tBuffer = 0
Next

_RTHeapFree($pBuffer)
_RTHeapFree($pObjName)
For $i = 1 To $aProcess[0][0]
        _RTCloseHandle(Eval("~" & $aProcess[$i][1]))
Next

MsgBox(48, "Bingo~", "Done~!~!")


Thread.au3 - http://www.autoitx.com/thread-18153-1-1.html
发表于 2010-9-14 19:47:25 | 显示全部楼层
来学习一下,还是不懂!
 楼主| 发表于 2010-9-17 08:34:41 | 显示全部楼层
回复 18# pusofalse
并不是所有mutex都能去关闭,或者说关闭了就能多开.
我的解决方法是使用DetourHook,在进程创建的瞬间注入,然后在勾到mutex后退出.
DetourHook是VC的HOOKAPI模块,在这里发源码并没有什么意义,需要的话可以问GOOGLE.
用AU3来跨进程去勾mutex还没尝试过,应该是可以实现的.关键是注入要及时.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 02:15 , Processed in 0.075794 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表