2010-08-03 90 views
2

使用Windows掛鉤我向我的應用程序發送消息,應用程序會通過系統上的每個應用程序通知Windows事件。DuplicateHandle:需要OpenProcess,但訪問被拒絕

要執行消息參數的編組,我使用共享存儲器。外部進程調用DuplicateHandle,但爲了與我的應用程序實例共享句柄,它應使用PROCESS_DUP_HANDLE權限要求調用OpenProcess

實際上,即使我需要啓用SeDebugPrivilege到外部進程,實際上每個應用程序都能夠使用此體系結構發送消息。它的實際工作,除了「資源管理器」的過程,沒有SeDebugPrivilege令牌......

AdjustTokenPrivileges狀態的文檔:

的AdjustTokenPrivileges函數不能添加新的權限來訪問令牌。它只能啓用或禁用令牌的現有權限。要確定令牌的權限,請調用GetTokenInformation函數。

所以,問題是...如何添加SeDebugPrivilege令牌「資源管理器」的過程,或者,如何讓「資源管理器」進程調用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)

回答

3

我不明白你爲什麼不使用命名爲共享內存。如果共享內存對象具有名稱,則可以在不使用DuplicateHandle的情況下打開這些對象。

如果您必須使用DuplicateHandle並且需要能夠使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)在任何過程中我發現您應該不使用SeDebugPrivilege。而不是你應該授予PROCESS_DUP_HANDLE給所有人與pId的過程。如果你創建一個進程,你可以指定安全描述符。如果已創建過程,則可以使用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

+0

這似乎正是我需要的!什麼SID對應於PROCESS_DUP_HANDLE? (我無法使用ProcEx ... :() – Luca 2010-08-03 22:12:52

+0

修改進程SID PROCESS_DUP_HANDLE是一個訪問權限,用於指定由ACE控制的訪問權限(請參閱http://msdn.microsoft.com/zh-cn/library/ aa374868.aspx)。您選擇的SID可以是衆所周知的Everyone組的SID(請參閱http://msdn.microsoft.com/en-us/library/aa379649.aspx)。如果您不熟悉安全描述符I建議您使用ConvertStringSidToSid或ConvertStringSecurityDescriptorToSecurityDescriptor,儘可能使用安全描述符定義語言(SDDL)(請參閱http://msdn.microsoft.com/zh-cn/library/aa379567.aspx)。 – Oleg 2010-08-03 22:31:45

+0

我發現這個:http:///stackoverflow.com/questions/1909084/is-there-a-way-to-modify-a-process-dacl-in-c(消息目標是一個託管進程)。它可以工作,但不能爲WellKnownSidType設置訪問掩碼。 「資源管理器」所屬的LogonIdsSid(無法創建LogonIdsSid類型的SecurityIdentifier)。嘆息。 – Luca 2010-08-03 23:43:22

1

這是你想要完成的嗎?

  1. 在「外部」進程中創建一個共享內存塊。
  2. 使用DuplicateHandle在應用程序中
  3. 使用窗口消息創建一個句柄內存句柄值發送到您的應用程序
  4. 訪問共享內存在應用程序

如果我正確理解,那麼你根本不需要打開應用程序的句柄。相反,只需給共享內存塊一個確定性名稱,如SharedMem_XXX,其中XXX是外部進程的PID。然後,使用窗口消息將PID發送到您的應用程序。然後它可以重新創建名稱並使用它來打開共享內存塊。

+0

不錯的解決方案,但是這隻會在我使用SendMessage時起作用,而不是在我使用PostMessage時起作用,因爲在應用程序處理消息之前應用程序可以發送多個消息。我嘗試用SendMessage替換PostMessage,並查看系統性能是否受到影響。謝謝你的照亮! – Luca 2010-08-03 21:50:51

+0

不客氣。我不太明白PostMessage與SendMessage的含義,但這可能與您的架構有關。如果你能提供更多關於你想要完成的細節,我可能會更有幫助。 – 2010-08-03 21:57:34

+0

根據您的具體情況,還有其他IPC機制可能更適合您的需求,如窗口消息,命名管道或遠程過程調用。 – 2010-08-03 21:59:35