2

セキュリティ上の理由から、アプリケーションの UI モジュールはhigh 必須の整合性レベルで実行されます。1 つのことを除いて、その中のすべてがうまく機能します。古いバージョンとの互換性のために、ユーザーが UI モジュールに対してコマンド ライン呼び出しを発行できるようにする必要があります。

現時点では、このメカニズムは次のように機能します。

  1. Windows エクスプローラーからのショートカットは、次のように私のモジュールを呼び出します。

    path-to-module\module.exe -op="a, s, r"
    
  2. プロセスは、このコマンド ラインを解析するときに、 FindWindowを使用して固有のクラス名module.exeで UI モジュール (または自己の別のコピー) の実行中のコピーを見つけます。次に、PostMessage APIを使用して登録済みのメッセージを送信します。

  3. 次に、実行中の UI モジュール (high完全性レベル) がメッセージを受信すると、それに応じて処理します。

問題は、UI モジュールの実行中のコピーにはhigh整合性レベルがあるため、整合性レベルが低い場合、またはショートカット コマンドを解析するために Windows エクスプローラーによって実行されたときにモジュールのコピーを受信できないため、整合性を保って実行されるmediumことです。レベル。

これに対処するために、このUIAccessフラグを見つけました ( here を参照し、「 UI 自動化アプリケーションの UIAccess」と表示されている場所までスクロールします)。

したがって、このフラグを設定して UI モジュールにコード署名すると、次のようになると仮定しました。

ここに画像の説明を入力

上で説明した UIPI の制限を回避できます。

それはうまく動作します:

ここに画像の説明を入力

しかし、私が見ているのはPostMessage、上記のアルゴリズムの API は、medium整合性レベルで実行されているモジュールから呼び出すと、依然として ERROR_ACCESS_DENIED で失敗するということです。

私はそこで何を逃したのですか?

4

1 に答える 1

4

あなたが説明することは、Win32 API ドキュメントでカバーされています。

PostMessage 関数

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、GetLastError を呼び出します。ERROR_NOT_ENOUGH_QUOTA制限に達すると、GetLastError が返されます。

メッセージが UIPI によってブロックされると、GetLastError で取得された最後のエラーが 5 (アクセス拒否) に設定されます。

UIPI はUser Interface Privilege Isolationです。

ユーザー インターフェイス特権の分離 (UIPI) とは

これは、UI Privilege Level Isolation (UIPI) とも呼ばれます。

Vista での安全な取り組みの一環として、UI を備えたアプリケーションは 3 つの異なるレベルの特権で実行されます。アプリケーション ウィンドウは、同じレベルまたは低いレベルの他のウィンドウと対話できますが、より高いレベル/権限のアプリケーションと対話することはできません。

より低い特権モードは、より高い特権のアプリケーションによってメッセージ呼び出しで明示的に許可されている場合にのみ、より高い特権のアプリケーションにメッセージを送信できますChangeWindowMessageFilter()HWNDまた、権限の低いアプリケーションは、権限の高いアプリケーションが所有するファイルのみを読み取ることができます。

Internet Explorer は、最低の特権レベルで実行されるプロセスの例です。

参照リンク:
http://msdn2.microsoft.com/en-us/library/ms632675.aspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html /AccProtVista.asp

UIPI は、以下の動作をブロックすることで、権限の低いプロセスが権限の高いプロセスにアクセスするのを防ぎます。

権限の低いプロセスは、次のことができません。

– より高いプロセス特権のウィンドウ ハンドル検証を実行します。
SendMessageまたはPostMessageより高い特権のアプリケーション ウィンドウに。これらのアプリケーション プログラミング インターフェイス (API) は、成功を返しますが、ウィンドウ メッセージをサイレントにドロップします
– スレッド フックを使用して、より高い特権プロセスに接続します。
– ジャーナル フックを使用して、より高い権限のプロセスを監視します。
– ダイナミック リンク ライブラリ (DLL) の実行 – より高い特権プロセスへのインジェクション。

UIPI を有効にすると、次の共有 USER リソースは、異なる特権レベルのプロセス間で引き続き共有されます。

– 実際にスクリーン サーフェスを所有するデスクトップ ウィンドウ
– デスクトップ ヒープ読み取り専用共有メモリ
– グローバル アトム テーブル
– クリップボード

ドキュメントにあるように、権限の高いアプリケーションは、権限のChangeWindowMessageFilter()低いアプリケーションからの特定のウィンドウ メッセージを許可するために使用する必要があります。

ユーザー インターフェイス特権分離 (UIPI) メッセージ フィルターからメッセージを追加または削除します。

Windows 7 以降では、ChangeWindowMessageFilterEx()代わりに次を使用します。

指定されたウィンドウのユーザー インターフェイス特権分離 (UIPI) メッセージ フィルターを変更します。

したがって、あなたの場合、より高い特権プロセスが登録されたメッセージ ID を取得するために呼び出した後、より低い特権プロセスからそのメッセージを受信するために、RegisterWindowMessage()その ID を渡す必要があります。ChangeWindowMessageFilter/Ex()

于 2016-10-19T18:59:35.780 に答える