来自Win32 app的x64图像上的OpenProcess

时间:2010-02-19 00:20:45

标签: winapi 32bit-64bit access-denied

这很奇怪。早些时候,运行Windows 7 x64,我无法针对64位进程调用Win32 OpenProcess。谷歌搜索了一下,并得出了沉没的结论,这不会发生。

然后发生了一件有趣的事情。我尝试使用explorer.exe的进程ID和神圣的鲤鱼,它有效!开始在其上抛出其他进程ID,这只是一个愚蠢的废话。

事实证明,我可以针对大量的x64进程调用OpenProcess - explorer,itype,ipoint,taskhost,cmd,mstsc,...等等。

其他人弹出5(访问被拒绝) - winlogon,csrss,services,svchost,mdm,......

我正在使用Process Explorer确认“bitness”和进程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位的应用程序。使用PROCESS_QUERY_LIMITED_INFORMATION我没有更好的结果。

谢谢...... Karl

1 个答案:

答案 0 :(得分:4)

您引用的流程(winlogon,csrss等)是关键的系统流程和服务。它们在不同的特权帐户下运行。即使您以管理员身份运行,您也不是这些流程的所有者,因此您的ACL不会获得任何权利。试图打开将导致拒绝访问。

但是,管理员组的成员确实有SeDebugPrivilege。这基本上是对OpenProcess和OpenThread的覆盖,允许您打开所有访问权限,即使您未在ACL中授予任何权限。

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

MSDN article提供了有关如何启用和禁用令牌权限的示例代码。