6

システムコールを傍受することを私が知っている方法は次のとおりです。

  1. ptraceを使用していますが、これには高いオーバーヘッドがあるようです。私の知識によると、straceのようなツールも内部でptraceを使用します。
  2. カーネルモジュールを使用してシステムコールテーブルを変更しますが、私の知る限り、この方法は後のLinuxカーネルでは使用できなくなりました。
  3. LD_PRELOADを使用します。ただし、たとえば、システムコールにラッパーライブラリ関数を使用せずに直接システムコールを行う場合、これは機能しません。

したがって、上記のすべての方法に欠陥があることがわかります。だから私の質問は、カーネルを変更せずに、最小限のオーバーヘッドでシステムコールをインターセプトする方法は何ですか?

4

3 に答える 3

4

カーネルを変更できない場合は、アプリケーションを変更する必要があります。ブレークポイントを設定するか(Linuxのアプリケーション内で処理できる場合、WindowsではSEH / VEHを使用して処理できます)、またはより煩わしい方法で命令をフックすることにより、//命令をint何らかの方法でインターセプトする必要があります(システムコール番号とパラメータを保存するコードに変更し、元の//を実行します)。syscallsysenterjmpintsyscallsysenterjmp

編集:ああ、私はそれらの指示を見つけることが挑戦になる可能性があることを追加するのを忘れました。コンパイルされたバイナリでそれらを正しく識別できない場合があります。一部(特に実行時に作成されたもの)を見逃す可能性があり、//(コード分析が完全でない場合)について他のいくつかの指示を行うことがintできますsyscallsysenterOTOH、実行時に(実行/エミュレートする前に個々の命令(またはそれらのブロック)を分析することによって)それらを見つけると、パフォーマンスが低下します。

いずれにせよ、パフォーマンスの問題は、行われるシステムコールの数と、ログに記録される/トレースされる情報の量に直接関係している可能性があります。それを削減する(つまり、興味深いシステムコールとパラメータのみを選択する)か、たとえば最後の10000システムコールに関する情報のみを収集し、データをメモリに保持して、ファイルに1回だけ(最後に)保存する場合アプリの)、はるかに優れたパフォーマンスが得られます。

于 2012-07-02T10:22:55.083 に答える
1

DTraceSystemTapなどの動的計測フレームワークの使用を検討してください。プラットフォームで 1 つまたは両方を使用できる必要があります。

于 2012-07-02T10:16:36.613 に答える
1

ピンツールも役立つかもしれません。Linux でも利用できます。

于 2012-07-02T10:36:21.910 に答える