Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenProcess:仅在Windows 8.1上出现拒绝访问错误_Windows_Winapi_Windows 8.1_Openprocess - Fatal编程技术网

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

OpenProcess:仅在Windows 8.1上出现拒绝访问错误,windows,winapi,windows-8.1,openprocess,Windows,Winapi,Windows 8.1,Openprocess,我有一个程序,可以调整SeDebugPrivilege,然后开始迭代系统进程,并为它们调用OpenProcess(还可以做其他事情,但现在已经不重要了)。当然,程序也会在管理员模式下运行。在Windows XP和Windows 7上,它工作正常,但在Windows 8.1上,以下系统进程的OpenProcess失败,错误为“访问被拒绝”(5):smss.exe、csrss.exe、services.exe。正如我所知,使用SeDebugPrivilege,我应该能够打开这些进程并检索它们的句柄。

我有一个程序,可以调整SeDebugPrivilege,然后开始迭代系统进程,并为它们调用OpenProcess(还可以做其他事情,但现在已经不重要了)。当然,程序也会在管理员模式下运行。在Windows XP和Windows 7上,它工作正常,但在Windows 8.1上,以下系统进程的OpenProcess失败,错误为“访问被拒绝”(5):smss.exe、csrss.exe、services.exe。正如我所知,使用SeDebugPrivilege,我应该能够打开这些进程并检索它们的句柄。有人知道是什么魔法只在Windows8.1上导致了这个错误吗


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

Windows8.1引入了一个新的概念。这是在第三方反恶意软件的上下文中记录的,但似乎可以合理地假设它也用于保护特别关键的系统进程

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

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

  • 删除
  • 读取控制
  • WRITE\u DAC
  • 写入所有者
  • PROCESS\u CREATE\u THREAD
  • PROCESS\u DUP\u HANDLE
  • 处理查询信息
  • 处理设置配额
  • 处理设置信息
  • 处理虚拟机操作
  • PROCESS\u VM\u READ
  • PROCESS\u VM\u WRITE

您仍然可以通过请求
process\u QUERY\u LIMITED\u信息
访问权限来打开流程。根据文档,还允许访问
同步
进程_终止

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

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时。在我的例子中,我是在Windows10上运行的,但我怀疑这是类似的,但自从我开始工作后,我想我会分享一些对我有帮助的东西

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

[DllImport("kernel32.dll")]
        private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
影响成功访问现有进程的一个关键因素是正确定义正确的“期望访问”值,在我的例子中,该进程是一个winlogon.exe进程。在我的例子中,我使用了一个常量“允许的最大值”,定义为:

private const uint MAXIMUM_ALLOWED = 0x2000000;
此服务调用如下所示:

IntPtr hProcess = OpenProcess(MAXIMUM_ALLOWED, false, targetWinlogonProcessId);
这建立了正确的访问方式。我还以LocalSystem帐户的身份运行我的进程(web服务),该帐户具有相当好的权限。一开始是:

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

在我的例子中,我想添加SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege,这是我通过secpol.msc添加的:


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

我想你已经没有足够的权利了。谢谢你的回答!明天我会更仔细地阅读您提供的内容,但现在我有点失望和困惑,为什么我甚至不能从这些流程中读取信息……您应该能够通过
流程查询有限的信息访问权限来读取一些信息。这取决于你到底想得到什么。我认为进程查询有限的信息对我来说是不够的,所以我会寻找另一种方法(可能在内核或其他方面)。我需要有关内存和加载模块的信息。。。