2

Microsoft Windows で、プロセスを生成し、プロセスの終了ステータスに加えて、プロセスが読み書きしたすべてのファイルのリストを返す C++ 関数を作成したいと考えています。生成されたアプリケーションからの協力は必要ありません。

たとえば、生成されたプログラムが Visual Studio C++ コンパイラである場合、関数は、コンパイラが開いたソース ファイル、読み取ったすべてのヘッダー ファイル、および.OBJ作成したファイルを含むリストを生成します。.DLLプログラムに含まれるファイルなども含まれていれば問題ありません。しかし、繰り返しになりますが、生成されたプログラムに関係なく動作するはずです。コンパイラは単なる例です。

ひねり: プロセスがサブプロセスを作成する場合、それらのファイル アクセスも監視する必要があります。

2 つめのひねり: プロセスがファイルを開こうとした場合、そのファイルを作成できるようになるまでプロセスを待機させ、その後で再開してファイルを開くことができるようにしたいと考えています。(これはETWを除外すると思います。)

これはおそらく何か恐ろしいクラッジの材料のように聞こえるでしょう。しかし、これを機能させることができれば、最終結果は本当に素晴らしいものになるでしょう。

4

1 に答える 1

1

2 つ目のひねり: プロセスがファイルを開こうとした場合、そのファイルを作成できるようになるまでプロセスを待機させ、その後で再開してファイルを開くことができるようにしたいと考えています。

あなたはその要件で Hack City に身を置くだけです。ETW の方がはるかに簡単なソリューションだったことは間違いありませんが、ファイル呼び出しをブロックする方法もありません。

基本的に、ここであなたがしなければならないことは次のとおりです。

  1. 中断されたプロセスを作成する
  2. 名前がよく知られている (おそらくプロセスの PID を含む) 2 つの名前付きパイプを反対方向に作成します。
  3. LoadModule をフックすると、フックは Kernel32 がロードされるのを監視します
  4. Kernel32 が読み込まれると、CreateFileW と CreateFileA をフックし、CreateProcessEx と ShellExecute もフックします。
  5. CreateFile フックがヒットしたら、名前付きパイプの 1 つに名前を書き込み、親プロセスが続行するように通知するまで、もう一方のパイプで ReadFile を実行します。
  6. CreateProcessEx フックがヒットすると、現在のプロセス内から同じプロセスをもう一度実行できます (継承されたハンドルが台無しになるため、親プロセスに CreateProcess を実行させることはできないことに注意してください)。
  7. 子プロセスを開始します。

コードをインジェクトし、メモリ内のイメージに修正を加えることになることに注意してください。これは、自分のものとはビット数が異なる可能性があります (つまり、アプリは 64 ビットですが、32 ビット プロセスを開始しています)。挿入する shim コードの x86 バージョンと amd64 バージョンの両方が必要です。この長い批判を書くことで、これは実際には正しく理解するのが非常に難しい恐ろしい考えであり、Win32 関数をフックする人々は Windows OS 開発者を悲しませていることを確信していただければ幸いです。

于 2010-09-09T05:41:52.507 に答える