5

write()、open() などの多くのシステム コール関数をラップし、LD-PRELOAD を使用して元のシステム コールをオーバーライドしました。さらに、さらにいくつかの関数を定義し、これもシュレッド ライブラリにしました。

共有ライブラリに入る前に、さまざまなアプリケーション プロセスからこれらの共有ライブラリへのすべてのシステム コールをキャッチしたいと考えています。どうやってやるの?

ありがとう

4

3 に答える 3

5

LD_PRELOAD は、a) ライブラリ呼び出しのみをインターセプトできるようにし、b) ライブラリ呼び出しのみをインターセプトできるようにするため、システム コールを挿入するのに必ずしも良い方法ではありません。;)

A) 一般に、システム コールはシステム内の共有 libC によってラップされますが、システム コールを自分で呼び出すことを妨げる人はいません。たとえば、x86 システムで正しいレジスタの内容を設定してから INT 0x80 を発行する場合などです。興味のあるプログラムがそうしている場合、LD_PRELOAD ベースの libc-interposition でそれらをキャッチすることは決してありません。

B) 一般に、ほとんどのプログラムはシステム内の共有 libC を使用してシステム コールを作成しますが、アプリケーションが静的にリンクされる場合があります。これは、libC コードがアプリケーションの一部であり、共有 lib からのものではないことを意味します。そのような場合、LD_PRELOAD も役に立ちません。

strace/ltrace を使用するように既に提案されているコメント - 私の一般的なアドバイスは、これらのツールの両方が使用し、カーネルを変更する必要なく必要なものを提供する ptrace() を確認することです。

于 2011-06-04T18:12:01.627 に答える
1

システム コールのユーザー レベルのリンク時のインターセプトとライブラリ関数への介入はうまくいくかもしれませんが、私はテストしていません。

于 2011-11-28T11:21:56.983 に答える
0

これを行う唯一の方法は、システム コール テーブルを変更することだと確信しています。HIDS システム (Samhain など) はこれを侵入として報告し、Linux カーネル開発者はこれにひどく眉をひそめます。実装の詳細は OS に固有のものです (つまり、FreeBSD で動作するものが Linux でも動作するとは限りません) が、一般的な実装の詳細は同じになります。カーネル モジュールは、よりクリーンで標準化された API を使用するためのより良い方法かもしれません。

于 2011-06-04T17:05:48.483 に答える