3

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

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

实际上,每个应用程序都可以使用这种架构发送消息,即使我需要为外部进程启用 SeDebugPrivilege。它实际上可以工作,除了没有 SeDebugPrivilege 令牌的“explorer”进程......

AdjustTokenPrivileges的文档指出:

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

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

4

2 回答 2

4

我不明白你为什么不使用命名共享内存。如果您的共享内存对象有名称,则可以在不使用DuplicateHandle.

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

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

于 2010-08-03T21:53:42.387 回答
1

这是你想要完成的吗?

  1. 在“外部”进程中创建一块共享内存。
  2. 使用 DuplicateHandle 在应用程序中创建该内存的句柄
  3. 使用窗口消息将句柄值发送到您的应用程序
  4. 访问应用程序中的共享内存

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

于 2010-08-03T21:27:23.430 回答