c++ - DuplicateHandle : need to OpenProcess, 但访问被拒绝

标签 c++ security winapi elevated-privileges

我使用 Windows Hook 向我的应用程序发送消息,系统上的每个应用程序都会通知该应用程序有关 Windows 事件。

为了执行消息参数的编码,我使用了共享内存。外部进程调用 DuplicateHandle , 但为了与我的应用程序实例共享句柄,它应调用 OpenProcess具有 PROCESS_DUP_HANDLE 权限要求。

实际上每个应用程序都可以使用此架构发送消息,即使我需要为外部进程启用 SeDebugPrivilege。它确实有效,除了“explorer”进程,它没有 SeDebugPrivilege token ...

AdjustTokenPrivileges 的文档状态:

The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges. To determine the token's privileges, call the GetTokenInformation function.

所以,问题是……如何将 SeDebugPrivilege token 添加到“explorer”进程,或者如何允许“explorer”进程调用 OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)

最佳答案

我不明白你为什么不使用命名共享内存。如果您的共享内存对象有名称,则无需使用 DuplicateHandle 即可打开该对象。

如果你确实必须使用 DuplicateHandle 并且需要能够在任何进程中使用 OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) 我发现你不应该使用 SeDebugPrivilege。相反,您应该授予PROCESS_DUP_HANDLE 权限给每个人,以使用pId 进程。如果您创建一个进程,您可以指定安全描述符。如果进程已经创建,您可以使用 OpenProcessGetSecurityInfo(参见 http://msdn.microsoft.com/en-us/library/aa446654.aspx)和 SetSecurityInfo 修改进程的安全描述符。

要测试此方法,您只需启动具有管理权限的 Process Explorer(请参阅 http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx),打开所选进程(具有 pId 的进程)的安全选项卡并修改其安全描述符。之后,所有进程都可以使用 OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) 而无需启用 SeDebugPrivilege

关于c++ - DuplicateHandle : need to OpenProcess, 但访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3400675/

相关文章:

c++ - 使用循环停止 QThread 的正确方法(从 opencv 读取视频)

javascript - 使用 Node 保护 API

security - Web 应用程序中安全问题的最佳实践

c++ - 静态函数中不可访问的非静态成员

c# - 学习VB.NET/C&C++和C#.NET的最佳视频教程/书籍或教程站点

c++ - clang++编译模板类并在 header 中实现

security - 嵌入式脚本的起源是什么?

windows - 如何获取父窗口的孙子或孙子的儿子

python - 在 Python 应用程序 (Windows) 中创建小型转储

c++ - C: union 实际用在什么地方?