我正在用C#和C ++ / CLI编写应用程序,我有代码可以暂停进程。但是,我想阻止它们被另一个进程(例如Process Explorer)取消挂起。是否有可能获得独占进程句柄或以其他方式阻止其他应用程序执行此操作?如果是这样,怎么样?
答案 0 :(得分:3)
从用户模式来看这是不可能的。
任何在令牌中启用SE_DEBUG_PRIVILEGE
的进程都可以打开具有所有访问权限的进程/线程句柄(仅当它不受保护进程时)。
您可以使用ObRegisterCallbacks
注册自己的回调并过滤进程/线程打开尝试。说拒绝处理打开或从OB_PRE_CREATE_HANDLE_INFORMATION
中的PROCESS_SUSPEND_RESUME
移除THREAD_SUSPEND_RESUME
,THREAD_RESUME
和DesiredAccess
。但这并不妨碍另一个内核模式代码调用导出api PsResumeProcess
。
一般来说,对象句柄部分支持独占访问。在OBJECT_ATTRIBUTES
中查找OBJ_EXCLUSIVE
标志(这总是作为3-rd参数传递给任何打开/创建对象调用 - ZwOpenProcess
)但这只能用于如果在创建对象时设置了OBJ_EXCLUSIVE
标志。否则你得到了STATUS_INVALID_PARAMETER
或者如果句柄已经被另一个进程打开了,你得到了STATUS_ACCESS_DENIED
。但是因为进程总是在没有OBJ_EXCLUSIVE
标志的情况下创建 - 你并且无法在独占中打开它句柄(我已经没有说过与进程会话相关的csrss.exe
已经存在对你的进程的打开句柄)
答案 1 :(得分:0)
您可以将代码注入另一个正在运行的进程,并修补NTDLL导出的NtResumeProcess和NtResumeThread例程。导出的例程将执行系统调用,但是您可以在发生此转换之前进行拦截,并将执行重定向到您自己的回调例程以应用过滤 - 返回STATUS_ACCESS_DENIED或其他适当的NTSTATUS错误代码来阻止操作。
但是,这不会阻止某人通过手动系统调用绕过您的补丁。你最好的选择是ObRegisterCallbacks然后剥离PROCESS_SUSPEND_RESUME给你自己以外的任何来电者。
通过运行时字节修补的第一种方法很好,因为用户模式挂钩只要它正确完成就不是问题。还有用于实现此目的的开源库,Microsoft也拥有自己的API挂钩库,名为MS Detours。 ObRegisterCallbacks方法将需要内核模式设备驱动程序,因此需要支持内核模式软件签名的数字签名(并且对于启用了安全启动的系统的支持,您需要进行扩展验证签名仅发给真正注册的公司,价格较贵。
祝你好运。