3

デッドロックの診断に役立つアプリケーションのデバッグ機能を開発しています。アプリケーションはクライアントのマシンで実行されるため、さまざまなオペレーティング システム、セキュリティ ポリシーなどを想定しています。

私が使用している手法は、他の診断情報と共に、すべてのスレッドのスタック トレースを生成する関数をターゲット アプリケーションに実装することです。これは、メモリ マップ ファイルに書き込まれます。また、診断レポートの作成をトリガーするために使用されるユーティリティ アプリケーションを作成し、それをメモリ マップ ファイルから読み取ります。

ターゲット アプリケーションは停止していることが予想されるため、ユーティリティ プログラムはメッセージを送信して診断収集をトリガーすることができません。代わりにCreateRemoteThread、作業を行うためのライブスレッドを確実に取得できるように使用しています。

LoadLibraryこれは、 のスレッド プロシージャとして通常使用される DLL インジェクション メソッドとは異なることに注意してくださいCreateRemoteThread。私のスレッド プロシージャは、ターゲット アプリケーションのエントリ ポイントです。だから、私は電話する必要はありませんWriteProcessMemory

私はこれを実装しましたが、テスト環境ではうまく機能します。のドキュメントによるCreateRemoteThreadと、次のアクセス権を持つプロセス ハンドルが必要です。

PROCESS_CREATE_THREADPROCESS_QUERY_INFORMATIONPROCESS_VM_OPERATIONPROCESS_VM_WRITE、およびPROCESS_VM_READ

そのため、呼び出し時にこれらのフラグを渡しましたOpenProcess

OpenProcessさて、最後に、私の質問に: への呼び出しを成功させるには、トークンにどのような権限が必要ですか?

私のテスト環境 (Windows 7、UAC 有効、管理者ユーザー) では、既定のトークンだけで問題は発生しませんでした。SE_DEBUG_NAME呼び出す前に権限を取得するサンプルコードをいろいろ見てきOpenProcessました。私の推測では、WriteProcessMemoryDLL インジェクションを行うときに必要であり、その特権は必要ないと思います。トークンの権限を調整する必要があるシナリオはありますか?

私は Windows のセキュリティについて何も知らないので、詳しい方からの賢明な言葉をいただければ幸いです。

4

1 に答える 1

3

通常、ターゲット プロセスがデバッガと同じコンテキストで (つまり、同じユーザーとして) 実行されている場合、OpenProcess または CreateRemoteThread のいずれにも特権は必要ありません。

ターゲット プロセスが別のユーザーとして実行されている場合、またはプロセスのアクセス許可が変更されている場合は、OpenProcess を呼び出す前に SE_DEBUG_NAME を有効にする必要がある場合があります。この権限により、プロセスに割り当てられたセキュリティ権限をバイパスして、任意のプロセスを開くことができます。(これは、バックアップ/復元権限によってファイルとディレクトリのセキュリティ権限をバイパスできるのと似ています。)

一部のアプリケーションは、ユーザーがタスク マネージャーを使用してプロセスを強制終了できないように、独自のプロセス許可を変更します。この場合、それはあなた自身のコードなので、問題にはなりません。原則として、他のソフトウェア (ウイルス対策ソフトウェアなど) によってプロセスのアクセス許可が変更される可能性がありますが、そのようなことが起こったという話は聞いたことがありません。

于 2012-08-29T23:53:58.083 に答える