12

ツールを書いています。そのツールの一部は、システム コールのパラメーターをログに記録する機能です。ptraceその目的に使用できますが、ptraceかなり遅いです。私の頭に浮かんだより高速な方法は、glibc を変更することでした。しかし、gcc は glibc で定義されたコードを使用するよりも、独自の組み込み関数をシステム コール ラッパーとして魔法のように挿入するため、これは難しくなっています。使用-fno-builtinもそこでは役に立ちません。

そこで、すべてのシステム コール ラッパーを含む共有ライブラリを作成するというアイデアを思いつきました。mmap次に、実際のシステム コール ラッパー関数を呼び出す前にロギングを実行します。たとえば、mymmapがどのように見えるかの疑似コードを以下に示します。

int mmap(...)
{
 log_parameters(...);
 call_original_mmap(...);
 ...
}

次に、LD_PRELOAD を使用して、このライブラリを最初にロードします。このアイデアはうまくいくと思いますか、それとも何か不足していますか?

4

4 に答える 4

3

ユーザースペースで思いつく可能性のある方法は、どのアプリケーションでもシームレスに機能しません。幸いなことに、カーネルでやりたいことを正確に実行するためのサポートがすでにあります。KprobesとKretprobesを使用すると、システムコールの直前と直後のマシンの状態を調べることができます。

ここのドキュメント: https ://www.kernel.org/doc/Documentation/kprobes.txt

于 2012-07-01T22:48:35.640 に答える
1

他の人が述べたように、バイナリが静的にリンクされている場合、動的リンカは libdl を使用して関数をインターセプトしようとする試みをスキップします。代わりに、自分でプロセスを起動し、インターセプトする関数へのエントリ ポイントを迂回することを検討する必要があります。

これは、自分でプロセスを起動し、その実行をインターセプトし、メモリを書き換えて、メモリ内の関数の定義の先頭に、制御する新しい関数へのジャンプ命令を配置することを意味します。

実際のシステム コールをインターセプトしたくて を使用できない場合はptrace、各システム コールの実行場所を見つけて書き直すか、メモリ内のシステム コール テーブルを上書きして、制御したいプロセス。

于 2012-05-22T02:32:09.353 に答える
0

ユーザー空間からのすべてのシステム コールは、割り込みハンドラを経由してカーネル モードに切り替わります。このハンドラが見つかった場合は、おそらくそこに何かを追加できます。

編集私はこれを見つけましたhttp://cateee.net/lkddb/web-lkddb/AUDITSYSCALL.html。Linux カーネル: 2.6.6–2.6.39、3.0–3.4 は、システム コールの監査をサポートしています。これは、有効にする必要があるカーネル モジュールです。混乱しなければ、このモジュールのソースを見ることができます。

于 2012-05-21T20:26:12.760 に答える
0

開発しているコードがプロセス関連の場合、既存のコードを壊さずに代替実装を開発できる場合があります。これは、重要なシステム コールを書き直し、それをデバッグするために完全に機能するシステムが必要な場合に役立ちます。

あなたの場合、mmap() アルゴリズムを書き直して、エキサイティングな新機能 (または新機能で強化) を利用しています。最初の試行ですべてが正しく行われない限り、システムのデバッグは容易ではありません。機能しない mmap() システム コールは、確実にシステムが機能しなくなります。いつものように、希望があります。

多くの場合、残りのアルゴリズムを所定の位置に保持し、別の方法で代替を構築することは安全です。これは、使用するアルゴリズムを決定する条件としてユーザー ID (UID) を使用することで実現できます。

if (current->uid != 7777) {
/* old algorithm .. */
} else {
/* new algorithm .. */
}

UID 7777 を除くすべてのユーザーは、古いアルゴリズムを使用します。新しいアルゴリズムをテストするために、UID 7777 を持つ特別なユーザーを作成できます。これにより、重要なプロセス関連のコードのテストがはるかに簡単になります。

于 2012-07-19T17:46:48.473 に答える