代码之家  ›  专栏  ›  技术社区  ›  Karl E. Peterson

在来自Win32应用程序的x64图像上打开进程

  •  5
  • Karl E. Peterson  · 技术社区  · 16 年前

    这很奇怪。之前,在运行Windows7x64时,我在针对64位进程调用win32 openprocess时遇到了问题。谷歌搜索了一下,得出了一个令人沮丧的结论,这是不会发生的。

    然后发生了一件有趣的事。我对explorer.exe的进程ID进行了尝试,并且 圣鲤 ,成功了!开始向它扔其他进程ID,这只是一个该死的垃圾。

    事实证明,我可以针对大量的X64进程调用OpenProcess——资源管理器、IType、IPoint、taskhost、cmd、mstsc等等。

    其他的pop a 5(访问被拒绝)--winlogon、csrss、services、svchost、mdm…

    我正在使用Process Explorer确认“位”和进程ID。另外,在64位进程上调用getmodulefilenameex总是失败,因此提供了32/64的双重检查。

    这是代码:

    ' Get a handle to the process.
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
    If hProcess Then
       ' Grab the filename for base module.
       nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer))
       ' If running in x64, http://winprogger.com/?p=26
       If Err.LastDllError = ERROR_PARTIAL_COPY Then
          nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer))
       End If
       ' Truncate and return buffer.
       If nChars Then
          GetProcessFileName = Left$(Buffer, nChars)
       End If
       Call CloseHandle(hProcess)
    Else
       Debug.Print "LastDllError:"; Err.LastDllError
    End If
    

    没什么花哨的。只想查询进程的文件名或进程时间。有人知道我能打开的和我不能打开的有什么区别吗?

    额外信息:以管理员身份运行进程。UAC关闭。是的,这是一个32位的应用程序。使用过程查询有限的信息没有更好的结果。

    谢谢。。。卡尔

    1 回复  |  直到 16 年前
        1
  •  4
  •   Michael    16 年前

    您引用的进程(winlogon、csrss等)是关键的系统进程和服务。他们在另一个特权帐户下运行。即使您以管理员身份运行,您也不是这些进程的所有者,因此您在它们的ACL中没有被授予任何权利。尝试打开将导致访问被拒绝。

    但是,Administrators组的成员确实具有sedebug特权。这基本上是OpenProcess和OpenThread上的一个覆盖,它允许您为所有访问打开,即使您在ACL中没有被授予任何权限。

    sedebugprivilege显然是一个非常危险的特权-您可以绕过访问检查和修改/检查其他用户的进程。默认情况下,它存在于管理员的令牌中,但默认情况下不启用它。在调用OpenProcess之前需要启用此权限。

    这个 MSDN article 提供有关如何启用和禁用令牌中特权的示例代码。