0

exit システム コールをインターセプトし、プロセスが呼び出したときにコンソールにメッセージを出力するとします。これを行うには、独自の偽の終了システム コールを記述し、元の終了呼び出しの代わりにカーネルに偽の終了関数を呼び出させる必要があります。偽の exit 呼び出しの最後に、元の exit 呼び出しを呼び出すことができます。これを行うには、システム コール テーブル配列 (sys_call_table) を操作する必要があります。sys_call_table 配列を使用して、それを操作して、新しい偽の exit 呼び出しへの sys_exit エントリ ポイントを作成できます。元の sys_exit 呼び出しへのポインターを保存し、コンソールへのメッセージの出力が完了したらそれを呼び出す必要があります。ソースコード :

 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <sys/syscall.h>

 extern void *sys_call_table[];

 asmlinkage int (*original_sys_exit)(int);

 asmlinkage int our_fake_exit_function(int error_code)
 {
    /*print message on console every time we
     *are called*/
    printk("HEY! sys_exit called with error_code=%d\n",error_code);

    /*call the original sys_exit*/
    return original_sys_exit(error_code);
 }

 /*this function is called when the module is
 *loaded (initialization)*/
 int init_module()
 {
     /*store reference to the original sys_exit*/
     original_sys_exit=sys_call_table[__NR_exit];

     /*manipulate sys_call_table to call our
      *fake exit function instead
      *of sys_exit*/
     sys_call_table[__NR_exit]=our_fake_exit_function;
 }


 /*this function is called when the module is
   *unloaded*/
 void cleanup_module()
 {
     /*make __NR_exit point to the original
      *sys_exit when our module
      *is unloaded*/
     sys_call_table[__NR_exit]=original_sys_exit;
 }

このプログラムをコンパイルすると、次の警告が表示されました。

警告: "sys_call_table" [/home/roiht/driver/one.ko] 未定義!

調べてみると、カーネルのバージョンが 2.5 以降で sys_call テーブルの概念が変わっていることがわかりました。それで、私の質問は、新しいカーネルバージョンでこれを行う代替方法は何ですか?

4

2 に答える 2

1

EXPORT_SYMBOL() を使用してカーネルで明示的にエクスポートされている場合、任意のカーネル変数をモジュールで使用できます。カーネル バージョン 2.6 以降、sys_call_table のエクスポートは削除されました。したがって、このアプローチを使用する場合は、変数を明示的にエクスポートします。慣例として、このエクスポートは変数宣言の直後に行われますが、この変数が定義されている任意のファイルからエクスポートすることもできると思います。アプローチが機能したかどうかを確認するには、「cat /proc/kallsyms」の出力を調べます。

exit syscall をキャプチャする別の方法は、syscall 実行の sysenter 部分にフックを配置することです。詳細については、 http ://articles.manugarg.com/systemcallinlinux2_6.html を参照してください。

于 2012-10-12T20:58:27.230 に答える
0

カーネルに対応するファイルsys_call_tableからのアドレスを読み取ることができます。System.map-xxx通常、ファイルはディレクトリにあり、/boot名前はです。はコマンドの結果です。モジュール パラメーターを使用して、アドレスをモジュールに渡すことができます。System.map-<kernel-version>kernel-versionuname -r

于 2013-04-25T09:07:12.720 に答える