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

OpenProcess: access denied error only on Windows 8.1

我有一个程序可以调整 SeDebugPrivilege,然后开始遍历系统进程并为它们调用 OpenProcess(并做其他事情,但现在不重要)。该程序当然也以管理员模式运行。在 Windows XP 和 Windows 7 上工作正常,但在 Windows 8.1 上,以下系统进程的 OpenProcess 失败 ERROR_ACCESS_DENIED( 5): smss.exe, csrss.exe, services.exe。正如我对 SeDebugPrivilege 的了解,我应该能够打开这些进程并为它们检索句柄。有没有人知道,什么样的魔法只在 Windows 8.1 上导致这个错误?

(无论如何,我在 CreateToolhelp32Snapshot 的相同进程中遇到相同的错误)

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

系统保护进程是 Protected Process mechanism(Microsoft Word 文档)在 Windows Vista 中作为 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 访问。

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

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

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

我最近 运行遇到 Access is Denied 错误(在我的例子中是错误代码 5),同时 运行 遇到 Win32 OpenProcess API 然后稍后 运行宁 CreateProcessAsUser。就我而言,我在 Windows 10 上 运行ning,但我怀疑它是相似的,但自从它开始工作后,我想我会分享一些对我有帮助的东西。

因为我使用的是 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 帐户,该帐户具有相当好的权限。它开始于:

请注意,通过下载 PsExec.exe 和 运行ning PsExec.exe -i -s [=41,我能够使用 SYSTEM 帐户 运行 此命令=] 启动命令提示符,以便我可以查询使用该帐户的权限。你可以在这里找到一个很好的权限列表:

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

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

添加的

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