Winapi Win32应用程序中x64图像上的OpenProcess

Winapi Win32应用程序中x64图像上的OpenProcess,winapi,32bit-64bit,access-denied,Winapi,32bit 64bit,Access Denied,这很奇怪。早些时候,在运行Windows7x64时,我无法针对64位进程调用Win32 OpenProcess。谷歌搜索了一下,得出了这样的结论:这根本不会发生 然后发生了一件有趣的事。我在explorer.exe的进程ID上试过了,天哪,成功了!开始向它抛出其他进程ID,这只是一个该死的废话 事实证明,我可以针对大量x64进程调用OpenProcess——explorer、itype、ipoint、taskhost、cmd、mstsc等等 其他人则弹出5(访问被拒绝)——winlogon、cs

这很奇怪。早些时候,在运行Windows7x64时,我无法针对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位的应用程序。我没有更好的结果使用过程查询有限的信息


谢谢。。。Karl

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

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

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


这给出了如何在令牌中启用和禁用特权的示例代码。

Ouch。是的,就是这样,好吧。这也启用了GetProcessTimes。我看到Process Explorer也在使用该设置运行。所以,如果我在一个隐私最少的用户帐户下运行,它也不能这样做?无论如何,谢谢!:-)默认情况下,很少有组具有SeDebugPrivilege,基本上只有SYSTEM和administrators组。特权最低的用户肯定不会。如果他们这样做了,提升到完全权限将是微不足道的,因为你可以将你想要运行的代码注入到一个特权进程中。在阅读本文之前,我认为我必须在我的场景中进行单独的构建,但多亏了SeDebugPrivilege,我现在可以从32位进程调用openprocess并加载64位进程,在我的情况下,我可以加载lsass。