这很奇怪。早些时候,在运行 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/