我正在用C#和C++/CLI编写一个应用程序,并且有暂停进程的代码。但是,我想阻止它们被另一个进程(如Process Explorer)解除挂起。是否有可能获得独占的进程句柄或以其他方式阻止其他应用程序执行此操作?如果是这样,怎么样?获取独占进程句柄
获取独占进程句柄
回答
这是不可能的用户模式。
这在令牌已经启用SE_DEBUG_PRIVILEGE
可以打开进程/线程处理所有访问(仅当它不是受保护的进程)的任何进程。
从内核模式可以用ObRegisterCallbacks
和过滤进程/线程尝试开放注册自己的回调。说否认手柄打开或删除PROCESS_SUSPEND_RESUME
,从DesiredAccess
THREAD_SUSPEND_RESUME
和THREAD_RESUME
在OB_PRE_CREATE_HANDLE_INFORMATION
。但这并不妨碍另一个内核模式的代码调用导出api PsResumeProcess
。
一般来说,对象句柄部分支持独占访问。在OBJECT_ATTRIBUTES
中寻找OBJ_EXCLUSIVE
标志(这总是作为第3参数传递给任何打开/创建对象调用 - ZwOpenProcess
),但如果在创建对象时设置了OBJ_EXCLUSIVE
标志,则这将仅适用于。否则你得到STATUS_INVALID_PARAMETER
或者如果句柄已经被另一个进程打开,你得到了STATUS_ACCESS_DENIED
。但因为进程总是创建没有OBJ_EXCLUSIVE
标志 - 你并不能打开它独占处理(我已经没有说在csrss.exe
有关进程会话已存在打开句柄到您的过程)
您可以注入代码到另一个运行处理和修补由NTDLL导出的NtResumeProcess和NtResumeThread例程。导出的例程将执行系统调用,但是您可以在发生此转换之前拦截并将执行重定向到您自己的回调例程以应用过滤 - 返回STATUS_ACCESS_DENIED或其他适当的NTSTATUS错误代码以阻止该操作。
这不会阻止其他人虽然绕过了手动系统调用你的补丁。你最好的选择是ObRegisterCallbacks,然后剥离PROCESS_SUSPEND_RESUME给除你以外的任何来电者。
通过运行时字节打补丁第一种方法是很好的,因为用户模式挂钩是不是一个问题,只要它做好。也有用于实现这一点的开源库,Microsoft也拥有自己的API hooking库MS Detours。 ObRegisterCallbacks方法将需要一个内核模式设备驱动程序,因此需要支持内核模式软件签名的数字签名(并且对于启用了安全引导的系统的支持,您需要一个扩展验证签名只发给真正注册的公司,价格很高)。
祝你好运。
- 1. 获取进程主线程的句柄
- 2. 从浏览器进程获取句柄
- 3. 通过PID获取进程句柄
- 4. 获取进程表格的句柄c#
- 5. 获取正在运行的进程给定的进程句柄
- 6. 按进程名称获取进程句柄
- 7. Win32API - 如何从进程句柄获取进程的文件名?
- 8. 如何从进程ID获取进程句柄?
- 9. 找出哪个进程在USB设备句柄上独占锁定
- 10. 如何从win32进程获取线程句柄列表?
- 11. 如何在Windows中获取进程独占锁定文件夹?
- 12. 从进程得到句柄
- 13. lldbinit中的进程句柄
- 14. Qt句柄进程终止
- 15. 获取VB.NET中PID进程的所有子窗口的句柄
- 16. 从pid或句柄获取进程名称
- 17. 获取当前进程中所有句柄的名称
- 18. 如何获取本地COM服务器的进程句柄?
- 19. 通过窗口句柄获取未知进程的名称?
- 20. 获取给定进程的文件句柄
- 21. C# - 尝试获取进程的句柄时访问被拒绝
- 22. 获取窗口句柄
- 23. 从MemoryMappedFile获取Win32句柄
- 24. 从DataGridViewTextBoxCell获取句柄IntPtr?
- 25. 获取控制台句柄
- 26. 获取pagefile.sys的句柄
- 27. 从句柄中获取ContextMenu?
- 28. 获取Windows句柄的WNDPROC
- 29. 如何获取Windows中当前进程的所有子进程的句柄?
- 30. 获取所有窗口句柄和给定进程名称的相应标签句柄
最好的方向,我可以给你会看在[进程安全和访问权限(https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880 MSDN文档(V = vs.85)的.aspx)。您可能可以修改正在暂挂的进程的ACL,以防止其他进程暂停它。然后,当您想取消暂停时,您需要再次修改ACL,取消暂停,然后再次限制ACL。但是,具有足够高权限的其他进程(例如'SeDebugPrivilege',您的应用程序可能也需要它们)可能仍会覆盖您的限制。 – ozeanix
对于它的价值,只需为自己的应用程序获取“SeDebugPrivilege”可能是一个相当大的挑战!我的回忆是,你的应用程序需要以'SYSTEM'用户的身份运行,才能有足够的权限来修改它自己的权限列表。 – ozeanix
@ozeanix,如果你做得对,就不要这样做。任何以管理员权限运行的进程都可以启用调试权限。 (好吧,在默认配置中,无论如何。) –