子プロセスのファイルシステムのアクティビティを傍受する方法
-
06-07-2019 - |
質問
Cで書かれた他のプログラムのラッパー/ランチャーとして機能する小さなコマンドラインアプリケーションがあります(xargsと考えてください)。このアプリケーションは、FreeBSD / Linux(fork()/ exec()経由)およびWindows(CreateProcess())でコンパイルするように作成されています。子アプリケーションのコマンドライン引数をインターセプト、インジェクト、または他の方法で操作できることに加えて、子プログラムのファイルシステムアクティビティ(またはその子など)をインターセプトする簡単な方法があるかどうか疑問に思っていました。私は主に、読み取りまたは書き込みのためにアクセスされるファイル名だけに興味がありますが、そのファイルの内容には興味がなく、インターセプトをできるだけ軽量にしたいと思います。
上記の関連キーワードをいくつか調べてみると、Win32でこれを行う方法はたくさんあるようです。ファイルシステムフィルタードライバーからPEインポートテーブルヘッダーの改ざんまで。これらはどれも些細なものでも、ラッパープログラムの実行可能ファイルに自己完結できるものでもありません(たとえば、ほとんどの場合、メインの実行可能ファイルと一緒に追加のDLLまたはドライバーファイルが必要です)。 、UACまたはその他のプラットフォームデルタをハッキングする必要はありません。それは私の子プロセスなので、そのアクティビティを安全に監視できるはずです:)
Linuxにはinotify()がありますが、子プロセスのみに関係なく一般的なファイルシステムアクセスを監視します。 FreeBSDのkqueue()についても同じことが言えます。これらは、ラッパーの複数のインスタンスが異なるプログラムを実行している可能性があり、それぞれが自分の子のファイルシステムのアクティビティを相互に明確にする必要があるSMPの場合にも故障します。
SOコミュニティが提供しなければならない提案はありがたいです。
解決
" interposer"を書くfopenをフックし、すべての子プロセスのLD_PRELOAD環境変数を設定するライブラリ。これは、動的にリンクされたライブラリで動作します。
これを行う方法の例は、 http:// developersにあります。 sun.com/solaris/articles/lib_interposers.html および http://lists.debian.org/debian-powerpc/2004/11/msg00039.html は、fopen()インターポーザーの部分的な実装を示しています。
他のヒント
私が行う唯一の提案は、 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
に慣れたら、それは常に武器庫にある便利なツールです。