使用Windows钩子我向我的应用程序发送消息,该消息由系统上的每个应用程序通知Windows事件。
要执行消息参数的编组,我使用共享内存。外部进程调用DuplicateHandle,但是为了与我的应用程序实例共享句柄,它应该使用PROCESS_DUP_HANDLE权限要求调用OpenProcess。
实际上,即使我需要为外部进程启用SeDebugPrivilege,每个应用程序都能够使用此体系结构发送消息。它实际上有效,除了'explorer'进程,它没有SeDebugPrivilege令牌......
AdjustTokenPrivileges函数无法为访问令牌添加新权限。它只能启用或禁用令牌的现有权限。要确定令牌的权限,请调用GetTokenInformation函数。
所以,问题是......如何将SeDebugPrivilege令牌添加到“资源管理器”流程,或者如何允许“资源管理器”流程调用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)
?
答案 0 :(得分:3)
我不明白为什么你不使用命名共享内存。如果共享内存对象具有名称,则可以在不使用DuplicateHandle
的情况下打开此对象。
如果您必须使用DuplicateHandle
并且需要能够在任何进程中使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)
,我发现您不应该使用SeDebugPrivilege
。相反,您应该PROCESS_DUP_HANDLE
<{1}}向pId
的所有人<{1>}授予授予的权限。如果创建进程,则可以指定安全描述符。如果已创建该流程,您可以使用OpenProcess
,GetSecurityInfo
(请参阅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)
这是你想要完成的吗?
如果我理解正确,那么您根本不需要打开申请流程的句柄。相反,只需为共享内存块指定一个确定性名称,例如SharedMem_XXX,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到您的应用程序。然后,它可以重新创建名称并使用它来打开共享内存块。