真奇怪先前,在运行Windows 7 x64的系统上,我无法针对64位进程调用Win32 OpenProcess。谷歌搜索了一下,并得出了下结论,这根本不会发生。
然后发生了一件有趣的事。我针对explorer.exe的进程ID进行了尝试,圣鲤鱼也成功了!开始向其抛出其他进程ID,这只是一个荒谬的废话。
事实证明,我可以针对大量的x64进程调用OpenProcess-资源管理器,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没有更好的结果。
谢谢...卡尔
最佳答案
您引用的进程(winlogon,csrss等)是关键的系统进程和服务。它们以不同的特权帐户运行。即使您以管理员身份运行,您也不是这些进程的所有者,因此不会向您授予其进程的ACL中的任何权限。尝试打开将导致访问被拒绝。
但是,管理员组的成员确实具有SeDebugPrivilege。基本上,这是对OpenProcess和OpenThread的替代,即使您未在ACL中被授予任何权限,它也允许您打开所有访问权限。
SeDebugPrivilege显然是非常危险的特权-您可以绕过访问检查并修改/检查其他用户的进程。虽然默认情况下它以管理员 token 的形式出现,但默认情况下未启用它。您需要在调用OpenProcess之前启用此特权。
此MSDN article提供了有关如何启用和禁用 token 中特权的示例代码。