3

Windows フックを使用してアプリケーションにメッセージを送信すると、システム上のすべてのアプリケーションから Windows イベントが通知されます。

メッセージ パラメータのマーシャリングを実行するには、共有メモリを使用します。外部プロセスはDuplicateHandleを呼び出しますが、アプリケーション インスタンスとハンドルを共有するために、PROCESS_DUP_HANDLE 特権要件でOpenProcessを呼び出す必要があります。

実際には、外部プロセスに対して SeDebugPrivilege を有効にする必要がある場合でも、すべてのアプリケーションがこのアーキテクチャを使用してメッセージを送信できます。SeDebugPrivilegeトークンを持たない「エクスプローラー」プロセスを除いて、実際には機能します...

AdjustTokenPrivilegesのドキュメントには次のように記載されています。

AdjustTokenPrivileges 関数は、アクセス トークンに新しい特権を追加できません。トークンの既存の特権を有効または無効にすることしかできません。トークンの権限を確認するには、GetTokenInformation 関数を呼び出します。

それで、問題は... SeDebugPrivilegeトークンを「エクスプローラー」プロセスに追加する方法、または代わりに「エクスプローラー」プロセスが呼び出すことを許可する方法OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)ですか?

4

2 に答える 2

4

名前付き共有メモリを使用しない理由がわかりません。共有メモリオブジェクトに名前がある場合、このオブジェクトはを使用せずに開くことができますDuplicateHandle

を使用する必要があり、プロセス内でDuplicateHandle使用できる必要がある場合は、を使用しないでください。その代わりに、を使用してプロセスのすべての人に許可を与える必要があります。プロセスを作成する場合は、セキュリティ記述子を指定できます。プロセスがすでに作成されている場合は、 (http://msdn.microsoft.com/en-us/library/aa446654.aspxを参照)を使用して、プロセスのセキュリティ記述子を変更できます。OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)SeDebugPrivilegePROCESS_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 に答える