1

他のプログラムのラッパー/ランチャーとして機能するCで記述された小さなコマンドラインアプリケーションがあります(xargsを考えてください)。このアプリケーションは、FreeBSD / Linux(fork()/ exec()経由)およびWindows(CreateProcess())でコンパイルするように作成されています。子アプリケーションのコマンドライン引数をインターセプト、インジェクト、またはその他の方法で操作できることに加えて、子プログラムのファイルシステムアクティビティ(またはその子など)をインターセプトする簡単な方法があるかどうか疑問に思いました。私は主に、読み取りまたは書き込みのいずれかでアクセスされるファイル名だけに関心があり、そのファイルの内容には関心がなく、インターセプトを可能な限り軽量にしたいと考えています。

上からいくつかの関連するキーワードをグーグルで検索すると、Win32でこれを行う方法はたくさんあるようです。ファイルシステムフィルタードライバーからPEインポートテーブルヘッダーの改ざんまで。これらはどれも些細なことではなく、ラッパープログラムの実行可能ファイル内に自己完結できるものではありません(たとえば、ほとんどの場合、メインの実行可能ファイルと一緒に追加のDLLまたはドライバーファイルが必要になります)。また、可能であれば、これをWindows XP〜7で動作させたいと思います。 、UACまたは他のプラットフォームデルタをハックする必要はありません。これは私の子プロセスなので、そのアクティビティを安全に監視できるはずです:)

Linuxにはinotify()がありますが、これは私の子プロセスのみに関係なく、一般的なファイルシステムアクセスを監視します。FreeBSDのkqueue()についても同じことが言えます。これらは、ラッパーの複数のインスタンスが異なるプログラムを実行している可能性があり、それぞれが自分の子のファイルシステムアクティビティを相互に明確にする必要があるSMPの場合にも分類されます。

SOコミュニティが提供しなければならないかもしれない提案を確かに感謝します。

4

2 に答える 2

3

私が行う唯一の提案は、strace(システムコールとシグナルをトレースする)を使用することですが、これはデバッグツールであり、トレースされるプロセスのパフォーマンスに影響します。

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

私見-あなたが慣れているならstrace、それは常に武器庫にある便利なツールです。

于 2009-06-23T06:28:35.773 に答える
0

fopenをフックする「インターポーザー」ライブラリを作成し、すべての子プロセスにLD_PRELOAD環境変数を設定します。これは、動的にリンクされたライブラリで機能します。

これを行う方法の例はここにあります:http://developers.sun.com/solaris/articles/lib_interposers.htmlおよびhttp://lists.debian.org/debian-powerpc/2004/11/msg00039.htmlは、fopen()インターポーザーの部分的な実装を示しています。

于 2009-06-23T19:27:31.267 に答える