5

这很奇怪。早些时候,在运行 Windows 7 x64 时,我在针对 64 位进程调用 Win32 OpenProcess 时遇到了麻烦。谷歌搜索了一下,得出的结论是这不会发生。

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

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

其他人弹出 5(拒绝访问)--winlogon、csrss、服务、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 位应用程序。使用 PROCESS_QUERY_LIMITED_INFORMATION 没有更好的结果。

谢谢...卡尔

4

1 回答 1

4

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

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

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

这篇MSDN 文章提供了有关如何在令牌中启用和禁用权限的示例代码。

于 2010-02-19T00:43:35.557 回答