2017-06-12 107 views
4

我正在用C#和C++/CLI编写一个应用程序,并且有暂停进程的代码。但是,我想阻止它们被另一个进程(如Process Explorer)解除挂起。是否有可能获得独占的进程句柄或以其他方式阻止其他应用程序执行此操作?如果是这样,怎么样?获取独占进程句柄

+0

最好的方向,我可以给你会看在[进程安全和访问权限(https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880 MSDN文档(V = vs.85)的.aspx)。您可能可以修改正在暂挂的进程的ACL,以防止其他进程暂停它。然后,当您想取消暂停时,您需要再次修改ACL,取消暂停,然后再次限制ACL。但是,具有足够高权限的其他进程(例如'SeDebugPrivilege',您的应用程序可能也需要它们)可能仍会覆盖您的限制。 – ozeanix

+0

对于它的价值,只需为自己的应用程序获取“SeDebugPrivilege”可能是一个相当大的挑战!我的回忆是,你的应用程序需要以'SYSTEM'用户的身份运行,才能有足够的权限来修改它自己的权限列表。 – ozeanix

+1

@ozeanix,如果你做得对,就不要这样做。任何以管理员权限运行的进程都可以启用调试权限。 (好吧,在默认配置中,无论如何。) –

回答

3

这是不可能的用户模式。

这在令牌已经启用SE_DEBUG_PRIVILEGE可以打开进程/线程处理所有访问(仅当它不是受保护的进程)的任何进程。

从内核模式可以用ObRegisterCallbacks和过滤进程/线程尝试开放注册自己的回调。说否认手柄打开或删除PROCESS_SUSPEND_RESUME,从DesiredAccessTHREAD_SUSPEND_RESUMETHREAD_RESUMEOB_PRE_CREATE_HANDLE_INFORMATION。但这并不妨碍另一个内核模式的代码调用导出api PsResumeProcess

一般来说,对象句柄部分支持独占访问。在OBJECT_ATTRIBUTES中寻找OBJ_EXCLUSIVE标志(这总是作为第3参数传递给任何打开/创建对象调用 - ZwOpenProcess),但如果在创建对象时设置了OBJ_EXCLUSIVE标志,则这将仅适用于否则你得到STATUS_INVALID_PARAMETER或者如果句柄已经被另一个进程打开,你得到了STATUS_ACCESS_DENIED。但因为进程总是创建没有OBJ_EXCLUSIVE标志 - 你并不能打开它独占处理(我已经没有说在csrss.exe有关进程会话已存在打开句柄到您的过程)

0

您可以注入代码到另一个运行处理和修补由NTDLL导出的NtResumeProcess和NtResumeThread例程。导出的例程将执行系统调用,但是您可以在发生此转换之前拦截并将执行重定向到您自己的回调例程以应用过滤 - 返回STATUS_ACCESS_DENIED或其他适当的NTSTATUS错误代码以阻止该操作。

这不会阻止其他人虽然绕过了手动系统调用你的补丁。你最好的选择是ObRegisterCallbacks,然后剥离PROCESS_SUSPEND_RESUME给除你以外的任何来电者。

通过运行时字节打补丁第一种方法是很好的,因为用户模式挂钩是不是一个问题,只要它做好。也有用于实现这一点的开源库,Microsoft也拥有自己的API hooking库MS Detours。 ObRegisterCallbacks方法将需要一个内核模式设备驱动程序,因此需要支持内核模式软件签名的数字签名(并且对于启用了安全引导的系统的支持,您需要一个扩展验证签名只发给真正注册的公司,价格很高)。

祝你好运。