21

理由の詳細には触れずに、ローダブル モジュールからカーネル関数とシステム コールを置き換えるクリーンな (可能な限り) 方法を探しています。私の最初のアイデアは、いくつかの関数をオーバーライドするコードを作成し、元の関数を使用して (可能であれば関数を呼び出す可能性があります)、独自のコードを追加することでした。重要なのは、私が作成する関数には元の関数の名前が必要であるため、他のコードがそれにアクセスしようとすると、代わりに私の関数にアクセスすることです。

コードを適切な関数に投げ込むだけで、これをカーネルで直接 (比較的) 簡単に行うことができますが、カーネル (または C) コーディングの実践が必ずしも恐ろしいものではない小さな C マジックを誰かが知っているかどうか疑問に思っていました。同じ結果です。

#defines と typedefs の考えが頭に浮かびますが、頭の中でそれをハッキングすることはできません。

要するに、Linuxカーネルの関数を(モジュールから)効果的にオーバーライドする方法を知っている人はいますか?

編集:尋ねられたので、基本的にカーネル内から特定の機能(ディレクトリの作成/削除など)をログに記録したいのですが、健全性のために、大きなパッチを書く必要があるのではなく、ロード可能なモジュールが理にかなっているようですカーネルコードを変更し、変更ごとに再コンパイルします。カーネルに最小限のコードを追加しても問題ありませんが、ほとんどの作業をモジュールにオフロードしたいと考えています。

4

13 に答える 13

7

質問が3年前のものであることは理解していますが、この種のことをしようとしている他の人々の利益のために、カーネルにはkprobesと呼ばれるインターフェースがあり、必要なことだけを行います。

于 2011-11-10T17:10:22.850 に答える
4

おそらく、システムコール(PDFリンク)をフックすることをお勧めします。これにより、カーネル関数を呼び出すユーザープロセスを効果的にログに記録できます。カーネル関数のカーネル使用を本当にログに記録したい場合は、カーネル関数トレースを調べてください。

于 2008-11-14T20:19:26.837 に答える
3

あなたが何をしたいのか完全にはわかりませんが、kspliceが良い解決策になると思います。まだ開発中ですので、現時点で使用可能な状態かどうかはわかりません。

于 2008-11-14T18:48:25.380 に答える
2

LD_PRELOADを使用して関数をデプロイすることを検討しましたか?

関数は、環境変数LD_PRELOADで指定されたディレクトリにある共有ライブラリを介してデプロイされます。

慣例では、システムコールをインターセプトし、マジックを実行した後、コールを実際のシステムシュリブに渡します。しかし、あなたはそれをする必要はありません。

たぶん、「楽しさと利益のために図書館のインターポーザーを構築する」という記事を見てください。Solaris固有ですが、Linuxにも適用できます。

ところでこれは、Purifyなどのほとんどのメモリ分析ツールがどのように機能するかです。

于 2009-07-28T23:03:59.913 に答える
1

これが起こらないようにするためにカーネルで多くの作業が行われました。特に、syscall テーブルをモジュールに公開しないようにする作業です。ファイル アクセスをログに記録するためにサポートされている唯一のメカニズムはLSMですが、これはセキュリティ指向であり、将来は不確実です。API を文書化した PDF を次に示しますが、最新ではない可能性があります。

inotify は、ファイルの作成、削除、および変更を監視するのに、カーネル syscall 関数を破壊しようとするよりもはるかに優れた方法ですが、ユーザー空間から動作します。

ウィキペディア ( http://en.wikipedia.org/wiki/Inotify ) から引用: 監視できるイベントの一部は次のとおりです。

* IN_ACCESS - read of the file
* IN_MODIFY - last modification
* IN_ATTRIB - attributes of file change
* IN_OPEN and IN_CLOSE - open or close of file
* IN_MOVED_FROM and IN_MOVED_TO - when the file is moved or renamed
* IN_DELETE - a file/directory deleted
* IN_CREATE - a file/directory created
* IN_DELETE_SELF - file monitored is deleted

inotify は 2.6.13 以降のカーネルに存在し、その前身は dnotify ( http://en.wikipedia.org/wiki/Dnotify ) です。

于 2008-11-17T20:01:44.497 に答える
1

そのために監査を使用できると思います

于 2008-11-19T17:16:52.553 に答える
1

これはあなたにとって有益な読み物になるかもしれません。

基本的に、システム コール テーブルは新しいカーネルでは直接エクスポートされないため、検索を行ってその場所を特定する必要があります。次に、選択したシステム コールをインターセプトして操作できます。ただし、他のカーネル関数を置き換えることは、それらのいくつかがシステムコールと同じように編成されていない限り(ディスパッチテーブルなどに表示される)、はるかに困難になります。これはまったく一般的ではありません。

于 2009-11-05T09:31:16.187 に答える
0

呼び出しのみをログに記録する必要があり(つまり、実際にはそれらをオーバーライドしない)、カーネルコードへの少量の変更は許容されるため、最もクリーンな方法は、関心のある各関数にフックを追加することです(通知チェーンまたは単純な関数ポインタ)。次に、モジュールは、追加したすべてのフックに自分自身を登録します(そして、アンロード時にそれらから登録を解除します)。

他の誰かがあなたのためにフックを追加する作業をすでに行っている可能性も十分にあります。

于 2008-11-14T20:30:24.927 に答える
0

既存のシステム コールを変更するのではなく、インストルメント化する必要があります。これがSystemTapの目的です。独自のモジュールをコーディングしてシステム コールをインターセプトするという難しい方法が本当に必要な場合は、ルートキットに関する文献を読むことをお勧めしますが、手元にリンクがありません (ただし、phrack が思い浮かびます)。

于 2008-11-14T21:05:29.193 に答える
0

http://www.tldp.org/LDP/lkmpg/2.6/html/x978.htmlをご覧ください

于 2008-12-11T00:08:44.333 に答える
0

共有ライブラリがシステム コールを呼び出す場合、そのシステム コールを変更するモジュールを作成する必要はありません。システム コールの変更に関する詳細については、ここを 参照してください 。例はここにあります http://tldp.org/LDP/lkmpg/x931.html

于 2015-09-10T19:50:58.467 に答える
0

ほとんどのファイルシステム作業は、ファイルシステムコードがカーネルに組み込まれるのではなく、モジュールとしてビルドされたと仮定して、すでにモジュールで行われています (つまり、「実際の」答えはカーネルビルドオプションに依存します)。

ログに記録したいビットがすべてファイルシステム関連であり、それらのファイルシステム ルーチンがモジュールとして構築されていると仮定すると、関心のあるファイルシステム モジュールを変更して再ロードできるはずです。

これらの仮定が真実でない、または真実にすることができない場合、事態は明らかにややこしくなり、これ以上指摘することはできません.

于 2008-11-14T19:04:02.120 に答える