OpenProcess:仅在Windows 8.1上出现拒绝访问错误
我有一个程序,可以调整SeDebugPrivilege,然后开始迭代系统进程,并为它们调用OpenProcess(还可以做其他事情,但现在已经不重要了)。当然,程序也会在管理员模式下运行。在Windows XP和Windows 7上,它工作正常,但在Windows 8.1上,以下系统进程的OpenProcess失败,错误为“访问被拒绝”(5):smss.exe、csrss.exe、services.exe。正如我所知,使用SeDebugPrivilege,我应该能够打开这些进程并检索它们的句柄。有人知道是什么魔法只在Windows8.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,我应该能够打开这些进程并检索它们的句柄。
(无论如何,我在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添加的:
您所需的特定权限可能取决于您使用的帐户,但我希望这会有所帮助 我想你已经没有足够的权利了。谢谢你的回答!明天我会更仔细地阅读您提供的内容,但现在我有点失望和困惑,为什么我甚至不能从这些流程中读取信息……您应该能够通过
流程查询有限的信息访问权限来读取一些信息。这取决于你到底想得到什么。我认为进程查询有限的信息对我来说是不够的,所以我会寻找另一种方法(可能在内核或其他方面)。我需要有关内存和加载模块的信息。。。