OpenProcess:仅在Windows 8.1上访问被拒绝错误

时间:2015-02-03 16:05:01

标签: windows winapi windows-8.1 openprocess

我有一个调整SeDebugPrivilege的程序,然后开始迭代系统进程并为它们调用OpenProcess(并做其他的事情,但它现在并不重要)。此外,程序当然也以管理员模式运行。在Windows XP和Windows 7上它可以正常工作,但在Windows 8.1上,使用ERROR_ACCESS_DENIED(5)的以下系统进程的OpenProcess失败: smss.exe,csrss.exe,services.exe 。正如我所知,使用SeDebugPrivilege,我应该能够打开这些进程并为它们检索句柄。有没有人有线索,只有在Windows 8.1上才会出现这种错误?

(无论如何,我对CreateToolhelp32Snapshot的相同进程有同样的错误)

3 个答案:

答案 0 :(得分:5)

Windows 8.1引入了system protected process的概念。这是在第三方反恶意软件软件的背景下记录的,但假设它也用于保护特别关键的系统进程似乎是合理的。

受系统保护的进程是Windows Vista中引入的Protected Process mechanism(Microsoft Word文档)的扩展,作为DRM措施。

即使使用调试权限,您也无法获得受保护进程的任何访问权限:

  • DELETE
  • READ_CONTROL
  • WRITE_DAC
  • WRITE_OWNER
  • PROCESS_CREATE_THREAD
  • PROCESS_DUP_HANDLE
  • PROCESS_QUERY_INFORMATION
  • PROCESS_SET_QUOTA
  • PROCESS_SET_INFORMATION
  • PROCESS_VM_OPERATION
  • PROCESS_VM_READ
  • PROCESS_VM_WRITE

您仍然可以通过请求PROCESS_QUERY_LIMITED_INFORMATION访问权限来打开该流程。根据文档,还允许SYNCHRONIZEPROCESS_TERMINATE访问。

答案 1 :(得分:1)

它只能在内核中完成。获得所需信息的最佳方式是:

PsLookupProcessByProcessId()
KeStackAttachProcess()
ZwQueryInformationProcess() or whatever other functions you need to now call within the context of the attached process.
KeStackDetachProcess()

或者如果您只是在尝试而不是将任何内容放入生产代码中,您可以遍历各种半透明结构(EPROCESS,PEB,VAD等)以获取所需的信息。

答案 2 :(得分:1)

我最近在运行Win32 OpenProcess API时遇到Access is Denied错误(在我的情况下为错误代码5),然后在运行CreateProcessAsUser时遇到错误。就我而言,我在Windows 10上运行,但是我怀疑它与Windows 10类似,但是自从我开始工作以来,我想我会分享一些对我有帮助的事情。

当我使用C#时,我的Win32方法签名如下:

[DllImport("kernel32.dll")]
        private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

影响成功访问现有进程(在我的情况下是winlogon.exe进程)的一个关键因素是正确定义正确的“所需访问”值。就我而言,我使用的常量“ MAXIMUM_ALLOWED”定义为:

private const uint MAXIMUM_ALLOWED = 0x2000000;

此服务调用如下:

IntPtr hProcess = OpenProcess(MAXIMUM_ALLOWED, false, targetWinlogonProcessId);

这建立了正确的访问方式。我还以LocalSystem帐户运行进程(Web服务),该帐户具有相当好的特权。它开始为:

enter image description here

请注意,通过下载PsExec.exe并运行PsExec.exe -i -s cmd.exe来启动命令提示符,我能够使用SYSTEM帐户运行此命令,因此我可以使用该帐户查询特权。您可以在此处找到一份不错的权限列表:

https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment

就我而言,我想添加通过secpol.msc添加的SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege:

enter image description here

您所需的特定权限可能取决于您使用的帐户,但我希望这会有所帮助!