我正在尝试使用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.Handle
和Process.MainModule
都会抛出“拒绝访问”错误,尽管Process.MainModule
通过Process.ProcessName
间接调用时显然会成功。
System.Diagnostics
是否会在某种提升的权限下运作?如何提高我的应用程序的权限才能执行相同的操作?
答案 0 :(得分:1)
如何处理此类流程? 如何提高我的应用程序的权限才能执行相同的操作?
显然,应用程序需要自己提供SeDebugPrivilege
:How 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的所有权限。