LKMを用いたカーネル2.6でのシステムコールのフック
度々すみません。
LKMを使ったシステムコールのフックに挑戦しているのですがうまくいかずに悩んでいます。
お力を貸していただけたら嬉しいです。
ディストリビューション: Debian 4.0r4
カーネル: 2.6.24
以前2.6.18のカーネルを使っていたのですが、使用するカーネルのバージョンを上げました。
開発前にやったことをすべて書いておきます。
・ linux-source-2.6.24_2.6.24-6~etchnhalf.7_all.deb
・ linux-headers-2.6.24-etchnhalf.1-686_2.6.24-6~etchnhalf.7_i386.deb
・ linux-kbuild-2.6.24-1~etchnhalf.1_i386.deb
をダウンロードし、dpkg -i *.deb で展開。
/usr/src/linux-source-2.6.24/arch/x86/kernel/i386_ksyms_32.c
の末尾に以下の2行を追加
extern void *sys_call_table[];
EXPORT_SYMBOL(sys_call_table);
変更後以下の手順でカーネルコンパイル
cp /boot/config-2.6.18-6-686 .config
make menuconfig (Enterを押しっぱなしにして設定終了)
make-kpkg --initrd kernel_image
dpkg -i (kernel_image).deb
書いたプログラムは以下です。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/syscalls.h>
#include <linux/utsname.h>
#include <asm-x86/unistd_32.h>
MODULE_LICENSE("GPL");
extern void *sys_call_table[];
static char *msg = "[message.o]:";
asmlinkage int (*orig_open)(const char *pathname, int flags);
asmlinkage static int hook_open(const char *pathname, int flags)
{
printk(KERN_INFO "hook_open(\"%s\", %d)\n", pathname, flags);
return orig_open(pathname, flags);
}
static int message_module(void)
{
printk(KERN_INFO "%s loaded\n",msg);
printk(KERN_INFO "%s hook_init\n", msg);
orig_open = sys_call_table[__NR_open];
sys_call_table[__NR_open] = hook_open;
return 0;
}
static void message_remove(void)
{
printk(KERN_INFO "%s removed\n", msg);
printk(KERN_INFO "%s hook_exit\n", msg);
sys_call_table[__NR_open] = orig_open;
}
module_init(message_module);
module_exit(message_remove);
コンパイルすると以下のようなエラーが出ます。
user@debian:~/lkm/message$ make
make -C /lib/modules/2.6.24/build M=/home/user/lkm/message modules
make[1]: ディレクトリ `/usr/src/linux-source-2.6.24' に入ります
Building modules, stage 2.
MODPOST 1 modules
WARNING: "sys_call_table" [/home/user/lkm/message/message.ko] undefined!
make[1]: ディレクトリ `/usr/src/linux-source-2.6.24' から出ます
長文で申し訳ありませんが、お力をお貸しください。
宜しくお願いします。
お礼
mrproper は最初にやっていたのですが、なぜかいつも modules でひっかかっていました。 結局 2.4.20 を入れて対応しました。ありがとうございました。