我有一个调整SeDebugPrivilege的程序,然后开始迭代系统进程并为它们调用OpenProcess(并做其他的事情,但它现在并不重要)。此外,程序当然也以管理员模式运行。在Windows XP和Windows 7上它可以正常工作,但在Windows 8.1上,使用ERROR_ACCESS_DENIED(5)的以下系统进程的OpenProcess失败: smss.exe,csrss.exe,services.exe 。正如我所知,使用SeDebugPrivilege,我应该能够打开这些进程并为它们检索句柄。有没有人有线索,只有在Windows 8.1上才会出现这种错误?
(无论如何,我对CreateToolhelp32Snapshot的相同进程有同样的错误)
答案 0 :(得分:5)
Windows 8.1引入了system protected process的概念。这是在第三方反恶意软件软件的背景下记录的,但假设它也用于保护特别关键的系统进程似乎是合理的。
受系统保护的进程是Windows Vista中引入的Protected Process mechanism(Microsoft Word文档)的扩展,作为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
访问。
答案 1 :(得分:1)
它只能在内核中完成。获得所需信息的最佳方式是:
PsLookupProcessByProcessId()
KeStackAttachProcess()
ZwQueryInformationProcess() or whatever other functions you need to now call within the context of the attached process.
KeStackDetachProcess()
或者如果您只是在尝试而不是将任何内容放入生产代码中,您可以遍历各种半透明结构(EPROCESS,PEB,VAD等)以获取所需的信息。
答案 2 :(得分:1)
我最近在运行Win32 OpenProcess API时遇到Access is Denied错误(在我的情况下为错误代码5),然后在运行CreateProcessAsUser时遇到错误。就我而言,我在Windows 10上运行,但是我怀疑它与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);
这建立了正确的访问方式。我还以LocalSystem帐户运行进程(Web服务),该帐户具有相当好的特权。它开始为:
请注意,通过下载PsExec.exe并运行PsExec.exe -i -s cmd.exe来启动命令提示符,我能够使用SYSTEM帐户运行此命令,因此我可以使用该帐户查询特权。您可以在此处找到一份不错的权限列表:
就我而言,我想添加通过secpol.msc添加的SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege:
您所需的特定权限可能取决于您使用的帐户,但我希望这会有所帮助!