代码之家  ›  专栏  ›  技术社区  ›  Luca

DuplicateHandle:需要打开进程,但访问被拒绝

  •  2
  • Luca  · 技术社区  · 14 年前

    使用windows钩子,我向我的应用程序发送消息,系统上的每个应用程序都会通知它windows事件。

    为了执行消息参数的封送处理,我使用共享内存。外部进程调用 DuplicateHandle OpenProcess 使用PROCESS\u DUP\u处理权限要求。

    文件 AdjustTokenPrivileges

    AdjustTokenPrivileges函数无法向访问令牌添加新权限。它只能启用或禁用令牌的现有权限。要确定令牌的权限,请调用GetTokenInformation函数。

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Oleg    14 年前

    命名 共享内存。如果共享内存对象有名称,则可以不使用 DuplicateHandle

    如果你真的要用 重复句柄 需要能够使用 OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) SeDebugPrivilege . 相反,你应该 授予许可 属于 PROCESS_DUP_HANDLE 给每个人的过程 pId . 如果创建进程,可以指定安全描述符。如果已经创建了流程,则可以使用 OpenProcess GetSecurityInfo http://msdn.microsoft.com/en-us/library/aa446654.aspx SetSecurityInfo 修改进程的安全描述符。

    要测试这种方法,只需启动processexplorer(请参阅 http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx pId )并修改其安全描述符。之后,所有进程将能够使用 OpenProcess(PROCESS\u DUP\u HANDLE,FALSE,pId) 无需启用 .

        2
  •  1
  •   Peter Ruderman    14 年前

    这就是你想要达到的目标吗?

    1. 使用DuplicateHandle创建应用程序中该内存的句柄

    如果我理解正确,那么您根本不需要打开应用程序进程的句柄。相反,只要给共享内存块一个确定性的名称,比如SharedMem\uxxx,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到应用程序。然后,它可以重新创建名称并使用它打开共享内存块。

    推荐文章