write()、open() などの多くのシステム コール関数をラップし、LD-PRELOAD を使用して元のシステム コールをオーバーライドしました。さらに、さらにいくつかの関数を定義し、これもシュレッド ライブラリにしました。
共有ライブラリに入る前に、さまざまなアプリケーション プロセスからこれらの共有ライブラリへのすべてのシステム コールをキャッチしたいと考えています。どうやってやるの?
ありがとう
write()、open() などの多くのシステム コール関数をラップし、LD-PRELOAD を使用して元のシステム コールをオーバーライドしました。さらに、さらにいくつかの関数を定義し、これもシュレッド ライブラリにしました。
共有ライブラリに入る前に、さまざまなアプリケーション プロセスからこれらの共有ライブラリへのすべてのシステム コールをキャッチしたいと考えています。どうやってやるの?
ありがとう
LD_PRELOAD は、a) ライブラリ呼び出しのみをインターセプトできるようにし、b) ライブラリ呼び出しのみをインターセプトできるようにするため、システム コールを挿入するのに必ずしも良い方法ではありません。;)
A) 一般に、システム コールはシステム内の共有 libC によってラップされますが、システム コールを自分で呼び出すことを妨げる人はいません。たとえば、x86 システムで正しいレジスタの内容を設定してから INT 0x80 を発行する場合などです。興味のあるプログラムがそうしている場合、LD_PRELOAD ベースの libc-interposition でそれらをキャッチすることは決してありません。
B) 一般に、ほとんどのプログラムはシステム内の共有 libC を使用してシステム コールを作成しますが、アプリケーションが静的にリンクされる場合があります。これは、libC コードがアプリケーションの一部であり、共有 lib からのものではないことを意味します。そのような場合、LD_PRELOAD も役に立ちません。
strace/ltrace を使用するように既に提案されているコメント - 私の一般的なアドバイスは、これらのツールの両方が使用し、カーネルを変更する必要なく必要なものを提供する ptrace() を確認することです。
システム コールのユーザー レベルのリンク時のインターセプトとライブラリ関数への介入はうまくいくかもしれませんが、私はテストしていません。
これを行う唯一の方法は、システム コール テーブルを変更することだと確信しています。HIDS システム (Samhain など) はこれを侵入として報告し、Linux カーネル開発者はこれにひどく眉をひそめます。実装の詳細は OS に固有のものです (つまり、FreeBSD で動作するものが Linux でも動作するとは限りません) が、一般的な実装の詳細は同じになります。カーネル モジュールは、よりクリーンで標準化された API を使用するためのより良い方法かもしれません。