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
访问权限来打开该进程。根据文档,还允许 SYNCHRONIZE
和 PROCESS_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 帐户 运行 此命令=] 启动命令提示符,以便我可以查询使用该帐户的权限。你可以在这里找到一个很好的权限列表:
就我而言,我想添加 SeAssignPrimaryTokenPrivilege 和 SeIncreaseQuotaPrivilege,这是我通过 secpol.msc:
添加的
您所需的特定权限可能取决于您使用的帐户,但我希望这对您有所帮助!
我有一个程序可以调整 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
访问权限来打开该进程。根据文档,还允许 SYNCHRONIZE
和 PROCESS_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 帐户 运行 此命令=] 启动命令提示符,以便我可以查询使用该帐户的权限。你可以在这里找到一个很好的权限列表:
就我而言,我想添加 SeAssignPrimaryTokenPrivilege 和 SeIncreaseQuotaPrivilege,这是我通过 secpol.msc:
添加的您所需的特定权限可能取决于您使用的帐户,但我希望这对您有所帮助!