DuplicateHandle:需要OpenProcess,但访问被拒绝

时间:2010-08-03 20:51:35

标签: c++ security winapi elevated-privileges

使用Windows钩子我向我的应用程序发送消息,该消息由系统上的每个应用程序通知Windows事件。

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

实际上,即使我需要为外部进程启用SeDebugPrivilege,每个应用程序都能够使用此体系结构发送消息。它实际上有效,除了'explorer'进程,它没有SeDebugPrivilege令牌......

AdjustTokenPrivileges州的文件:

  

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

所以,问题是......如何将SeDebugPrivilege令牌添加到“资源管理器”流程,或者如何允许“资源管理器”流程调用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)

2 个答案:

答案 0 :(得分:3)

我不明白为什么你不使用命名共享内存。如果共享内存对象具有名称,则可以在不使用DuplicateHandle的情况下打开此对象。

如果您必须使用DuplicateHandle并且需要能够在任何进程中使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId),我发现您不应该使用SeDebugPrivilege。相反,您应该PROCESS_DUP_HANDLE <{1}}向pId的所有人<{1>}授予授予的权限。如果创建进程,则可以指定安全描述符。如果已创建该流程,您可以使用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

答案 1 :(得分:1)

这是你想要完成的吗?

  1. 在“外部”流程中创建一个共享内存块。
  2. 使用DuplicateHandle在应用程序中创建该内存的句柄
  3. 使用窗口消息将句柄值发送到您的应用程序
  4. 访问应用程序中的共享内存
  5. 如果我理解正确,那么您根本不需要打开申请流程的句柄。相反,只需为共享内存块指定一个确定性名称,例如SharedMem_XXX,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到您的应用程序。然后,它可以重新创建名称并使用它来打开共享内存块。