1

私は大学のプロジェクト用のプログラムを作成しようとしていましたが、これで行き詰まりました:

プログラムがどのファイルに書き込み、またはどのファイルから読み取るかについて、プログラムをどのように監視しますか? 私は彼らのパス名を知りたいです。

問題をより明確にするために、以下に例を示します。

監視するプログラムが a.exe であるとします。a.exe はまず a.exe と同じフォルダーにある「a1」という名前のファイルを開き、次に「a2」という名前の別のファイルを開きます。

プログラムは、読み取り/書き込み用に開いているかどうかに関係なく、「a1」および「a2」ファイルの相対パスまたは絶対パスを指定する必要があります。

これを C++ で実装するにはどうすればよいですか?

編集: a1 および a2 ファイルの呼び出しを別のパスに転送することは可能ですか?? EDIT2:わかりました、このように言いましょう:firefox.exeをC:\プログラムファイルからD:\に移動しました。現在、firefox.exeを実行すると、Cにある多くのファイルで動作するので動作しません:\program files の場合、firefox.exe はファイルへのアクセスに相対パスを使用します。私がやろうとしているのは、firefox.exe が動作するファイルの呼び出しをキャプチャし、その呼び出しをプログラム ファイル フォルダーに転送することです。私が自分自身を明確にしたかどうか教えてください..

4

2 に答える 2

1

Linux では、アプリケーションによって実行されるさまざまなシステム コールを出力する「strace」を使用できます。strace と同じ種類の出力を実行するプログラムを実装する必要がある場合、strace の出力を grep する単純なシェル プログラムで簡単に実装できます。それ以外の場合は、strace コードを調べることから始めてください。

Windows では、Sysinternals スイートの「プロセス モニター」が役立つ場合があります。

于 2011-04-02T13:53:40.877 に答える
0

、、、などの引数を変更する場合は、Linux (2)機能を使用してシステムコールをインターセプトし、呼び出しを実行する前にファイル名文字列を置き換えることができます。open(2)creat(2)truncate(2)ptrace

ptrace(2)は暗黒魔法なので、上級コースでない限り、教授の意図とは異なる可能性があります。(次の講義が のようなデバッガーの作成に関するものであるgdb(1)場合、これはまさに教授が意図したものです。)

使用できる別のメカニズムで、おそらくより移植性が高いのは、ライブラリまたは関数の挿入です。ライブラリ内の特定の関数の周りに小さなラッパーを記述し、環境変数を使用してライブラリをロードすることができLD_PRELOADます (環境変数ld.so(8)の詳細については、マンページを参照してください)。ライブラリのロードに影響を与える)、標準関数の代わりに関数が呼び出されます。

ライブラリの介入は灰色の魔法です。よりもよく文書化されていますがptrace(2)、それでも台無しにするのはかなり簡単です。

于 2011-04-02T22:07:31.277 に答える