winapi - 来自 Win32 应用程序的 x64 图像上的 OpenProcess

标签 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 确认“位数”和进程 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 没有更好的结果。

谢谢...卡尔

最佳答案

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

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

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

MSDN article提供有关如何在 token 中启用和禁用权限的示例代码。

关于winapi - 来自 Win32 应用程序的 x64 图像上的 OpenProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293266/

相关文章:

javascript - XMLHttpRequest 开放访问被拒绝

c++ - 让一个dll通过发送一个指针来调用一个.exe函数

c++ - 使用 AlphaBlend() 和 FillRect()

python - 无法在 Python 中导入 dll 模块

c++ - Windows 64 位和 32 位之间的共享内存接口(interface)

c++ - 尝试设置服务创建的事件时在应用程序中访问被拒绝

c++ - 加载 Win32 资源文件作为 wstringstream

c++ - vc++ 64 位 dll 参数大小不正确

c - 将 Fortran/C 程序从 32 位升级到多体系结构

javascript - 访问 IFrame 的 contentWindow.document 在 IE6 上给出 'Access is Denied'