打开进程:仅在Windows 8.1上出现访问被拒绝错误

6
我有一个程序,它会调整SeDebugPrivilege并开始遍历系统进程并为它们调用OpenProcess(还做其他事情,但现在不重要)。当然,该程序在管理员模式下运行。在Windows XP和Windows 7上运作良好,但在Windows 8.1上,对于以下系统进程,如smss.exe、csrss.exe、services.exe,OpenProcess将失败并显示ERROR_ACCESS_DENIED(5)。根据我的了解,使用SeDebugPrivilege应该能够打开这些进程并检索其句柄。有人知道什么样的魔法只在Windows 8.1上出现此错误吗?
(无论如何,我在CreateToolhelp32Snapshot中也遇到了相同的错误)

我猜你不再拥有足够的权限了。 - David Heffernan
3个回答

6

Windows 8.1引入了系统受保护进程的概念。这是在第三方反恶意软件的上下文中记录的,但可以合理地推测它也用于保护特别关键的系统进程。

系统受保护进程是受保护进程机制(Windows Vista引入的一种数字版权管理措施)的扩展。

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

  • DELETE(删除)
  • READ_CONTROL(读取控制)
  • WRITE_DAC(写入Dac)
  • WRITE_OWNER(写入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访问。


谢谢你的回答!我明天会更仔细地阅读你提供的内容,但现在我有点失望和困惑,为什么我甚至不能读取这些进程的信息... - Zoltán Várnagy
你应该能够通过PROCESS_QUERY_LIMITED_INFORMATION访问权限读取一些信息。这取决于你想要获取什么具体信息。 - Harry Johnston
我认为PROCESS_QUERY_LIMITED_INFORMATION对我来说不够用,所以我会寻找另一种方式(也许是在内核或其他地方)。我需要关于内存和已加载模块的信息... - Zoltán Várnagy

2

最近在运行Win32 OpenProcess API和CreateProcessAsUser时,我遇到了“拒绝访问”错误(在我的情况下是错误代码5)。在我的情况下,我正在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);

这样就建立了正确的访问权限。我也将我的进程(Web服务)作为LocalSystem帐户运行,该帐户拥有相当好的特权。它最初是这样的:

enter image description here

请注意,我能够使用SYSTEM帐户运行此命令,方法是下载PsExec.exe并运行PsExec.exe -i -s cmd.exe以启动命令提示符,从而可以使用该帐户查询权限。您可以在此处找到一个很好的权限列表:

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

在我的情况下,我想要添加SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege,我通过secpol.msc进行了添加:

enter image description here

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

1

这只能在内核中完成。获取所需信息的最佳方法是:

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

如果你只是进行实验,并没有将任何东西放入生产代码中,那么你可以遍历各种半透明的结构(如EPROCESS、PEB、VAD等)来获取所需信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接