デッドロックの診断に役立つアプリケーションのデバッグ機能を開発しています。アプリケーションはクライアントのマシンで実行されるため、さまざまなオペレーティング システム、セキュリティ ポリシーなどを想定しています。
私が使用している手法は、他の診断情報と共に、すべてのスレッドのスタック トレースを生成する関数をターゲット アプリケーションに実装することです。これは、メモリ マップ ファイルに書き込まれます。また、診断レポートの作成をトリガーするために使用されるユーティリティ アプリケーションを作成し、それをメモリ マップ ファイルから読み取ります。
ターゲット アプリケーションは停止していることが予想されるため、ユーティリティ プログラムはメッセージを送信して診断収集をトリガーすることができません。代わりにCreateRemoteThread
、作業を行うためのライブスレッドを確実に取得できるように使用しています。
LoadLibrary
これは、 のスレッド プロシージャとして通常使用される DLL インジェクション メソッドとは異なることに注意してくださいCreateRemoteThread
。私のスレッド プロシージャは、ターゲット アプリケーションのエントリ ポイントです。だから、私は電話する必要はありませんWriteProcessMemory
。
私はこれを実装しましたが、テスト環境ではうまく機能します。のドキュメントによるCreateRemoteThread
と、次のアクセス権を持つプロセス ハンドルが必要です。
PROCESS_CREATE_THREAD
、PROCESS_QUERY_INFORMATION
、PROCESS_VM_OPERATION
、PROCESS_VM_WRITE
、およびPROCESS_VM_READ
そのため、呼び出し時にこれらのフラグを渡しましたOpenProcess
。
OpenProcess
さて、最後に、私の質問に: への呼び出しを成功させるには、トークンにどのような権限が必要ですか?
私のテスト環境 (Windows 7、UAC 有効、管理者ユーザー) では、既定のトークンだけで問題は発生しませんでした。SE_DEBUG_NAME
呼び出す前に権限を取得するサンプルコードをいろいろ見てきOpenProcess
ました。私の推測では、WriteProcessMemory
DLL インジェクションを行うときに必要であり、その特権は必要ないと思います。トークンの権限を調整する必要があるシナリオはありますか?
私は Windows のセキュリティについて何も知らないので、詳しい方からの賢明な言葉をいただければ幸いです。