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 テーブルの概念が変わっていることがわかりました。それで、私の質問は、新しいカーネルバージョンでこれを行う代替方法は何ですか?