由“NT AUTHORITY \ SYSTEM”拥有的PID的OpenProcess

时间:2009-05-14 15:00:49

标签: .net winapi

我正在尝试使用OpenProcess函数在C#中打开一个进程句柄,如下所示:

IntPtr hProcess = OpenProcess(0x410, false, pid);

其中pid是我想要打开的进程的进程ID。

当用户名为“NT AUTHORITY \ SYSTEM”(在Vista x64上)的PID上调用时,上述调用失败,出现“拒绝访问”错误。

如何处理此类流程?

让我觉得最有可能的是.NET System.Diagnostics.Process类似乎能够对这些进程进行操作。例如,Process.ProcessName可以在此类进程中正常工作。在引擎盖下,它调用Process.MainModule.ModuleName,最终以与我完全相同的方式调用OpenProcess。但是,System.Diagnostics没有得到“拒绝访问”错误,而我这样做。

奇怪的是,任何试图将进程处理到我的应用程序中的东西都会抛出异常。例如,Process.HandleProcess.MainModule都会抛出“拒绝访问”错误,尽管Process.MainModule通过Process.ProcessName间接调用时显然会成功。

System.Diagnostics是否会在某种提升的权限下运作?如何提高我的应用程序的权限才能执行相同的操作?

2 个答案:

答案 0 :(得分:1)

  

如何处理此类流程?   如何提高我的应用程序的权限才能执行相同的操作?

显然,应用程序需要自己提供SeDebugPrivilegeHow To Use the SeDebugPrivilege to Acquire Any Process Handle

然而,通用应用依赖于此并不是一个好主意,因为SeDebugPrivilege is equivalent to administrator privileges(安全方面)。

我仍然不确定System.Diagnostics如何在不需要Process.ProcessName的情况下公开SeDebugPrivilege,但后来我对.NET的代码安全功能几乎一无所知。

答案 1 :(得分:1)

流程名称和其他一些内容不需要获取权限。

无论如何,你需要SeDebugPrivilege的原因是,对于OpenProcess的大多数参数,如果打开SYSTEM进程,你可能会损害机器的安全性。

出于显而易见的原因,请参阅WriteProcessMemory。

此外,.NET进程对内核并不特殊。如果您可以声明OpenProcess,则您拥有System.Diagnostics.Process的所有权限。