其实我想做一个程序多开的外挂,只要知道某软件创建的互斥体的名称就可以将它删除并且打开另一实例比如我用Process Explorer获取到RealOne Player创建的互斥体对象名称是RPApplicationRunningMutex,当我用PE关闭这个互斥体的句柄后就可以同时打开N个RealOne Player了又如飞信客户端的事件对象名是FetionInstance,关闭它同样也能打开另外一个飞信客户端。请问PE是怎样做到这点的?我参考了你的“解锁文件”的技术文章,模仿着用SystemObjectInformation来枚举对象,可是每次都是产生STATUS_UNSUCCESSFUL错误后来查到网上说要使NtGlobalFlags带FLG_MAINTAIN_OBJECT_TYPELIST标记才能正常执行,我就修改了HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Your Image File Name Here without a path下面的GlobalFlag子键(改成了0x000050F0)而且重启了计算机,但是还是产生了这个错误。另外
Private Declare Function RtlGetNtGlobalFlags Lib "NTDLL.DLL" () As Long
获取到的值一直是0分不是问题。。解决了我可以另外发帖再加~~~~先谢谢了!!!

解决方案 »

  1.   

    这个问题问得好,先Mark一下。
      

  2.   

    这个看来使用API HOOK好些~~
      

  3.   

    api hook好像复杂很多....这个方面我真的完全不懂了....
    或者我的方法有错误么?其实我也不清楚到底是应该用SystemObjectInformation还是SystemHandleInformation又或者是其他?
    我是因为用过SystemHandleInformation枚举不到OB_TYPE_EVENT和OB_TYPE_MUTANT类型的句柄才尝试用SystemObjectInformation的....
      

  4.   

    SystemHandleInformation这个就可以的
      

  5.   

    仅供参考
    http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Mutant/NtQueryMutant.html
      

  6.   

    谢谢回复~~~
    下面是我的代码....请指正....Private Sub cmdUnlock_Click()
    Dim lngHandles As Long
    Dim Buff() As Byte, Rec() As Byte, objInfo() As SYSTEM_HANDLE
    Dim StructLen As Long, Ret As Long, i As Long, j As Long, k As Long
    StructLen = 1
    Do
        ReDim Buff(StructLen - 1)
        Ret = NtQuerySystemInformation(SystemHandleInformation, VarPtr(Buff(0)), StructLen, 0&)
        If (Not NT_SUCCESS(Ret)) Then
            If (Ret <> STATUS_INFO_LENGTH_MISMATCH) Then
                Erase Buff
                Exit Sub
            End If
        Else
            Exit Do
        End If
        StructLen = StructLen * 2
    Loop
    CopyMemory lngHandles, Buff(0), 4
    ReDim objInfo(lngHandles - 1)
    CopyMemory objInfo(0), Buff(4), Len(objInfo(0)) * lngHandles
    For i = 0 To lngHandles - 1
        'If objInfo(i).ObjectTypeIndex <> 5 Then
        '    ReDim Preserve Rec(j)
        '    For k = 0 To j
        '        If Rec(k) = objInfo(i).ObjectTypeIndex Then Exit For
        '    Next
        '    If k = j + 1 Then
        '        ReDim Preserve Rec(j)
        '        Rec(j) = objInfo(i).ObjectTypeIndex
        '        j = j + 1
        '    End If
        'End If
        If (objInfo(i).ObjectTypeIndex = OB_TYPE_EVENT) Or _
            (objInfo(i).ObjectTypeIndex = OB_TYPE_MUTANT) Then
            Debug.Print i,
        End If
    Next
    End Sub没有看到调试窗口有输出....注释代码部分是将所有句柄的类型放到Rec()数组里面....
      

  7.   

    typeIndex=9是事件
    MUTANT我还没看明天帮你看
    现在有事情做
      

  8.   

    恩..你先忙...我不急着用...我只是想学习和知道如何实现这个功能....Private Enum SYSTEM_HANDLE_TYPE
        OB_TYPE_UNKNOWN = 0
        OB_TYPE_TYPE = 1
        OB_TYPE_DIRECTORY                  '2
        OB_TYPE_SYMBOLIC_LINK              '3
        OB_TYPE_TOKEN                      '4 令牌
        OB_TYPE_PROCESS                    '5 进程
        OB_TYPE_THREAD                     '6 线程
        OB_TYPE_UNKNOWN_7                  '7
        OB_TYPE_EVENT                      '8 事件
        OB_TYPE_EVENT_PAIR                 '9
        OB_TYPE_MUTANT                     '10 互斥体
        OB_TYPE_UNKNOWN_11                 '11
        OB_TYPE_SEMAPHORE                  '12 信号量
        ......
    End Type这个是我在你解锁文件上面复制的系统句柄类型枚举....
      

  9.   

    找到了一个貌似是法国人写的代码...可以根据PID枚举该进程打开的所有句柄....和PE的效果一样....但是上面没有带关闭句柄的代码.......哎....我真的太菜了....本来只是想各位高人给个思路..自己写代码的....现在找到了代码却觉得不是自己辛苦写出来的而不自在....那个代码的地址:http://www.vbfrance.com/codesource.aspx?ID=25915
      

  10.   

    哈哈哈~~~~终于OK了~~~~还是参考了陈辉大哥的解锁文件的代码~~~~~~"...大家知道"DuplicateHandle"这个函数吗?不错就是进行句柄复制的函数前一篇文章中就用到了它.不知道大家有没有用到当它使用"DUPLICATE_CLOSE_SOURCE"做参数时,对了这就是解决问题的关键.只要这样复制的句柄我们就可以在本进程关闭远程进程的句柄了......."我是通过这段话终于知道怎样做的~~~~~呵呵...明天整理好所有代码后发上来就结帖!!!再次感谢陈辉大哥!!!
      

  11.   

    代码比较长...我就不在这里发了...请大家到我的CSDN资源里面下载http://download.csdn.net/source/557214