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' から出ます
長文で申し訳ありませんが、お力をお貸しください。
宜しくお願いします。
補足
これはバグって事ですよね? なるほど。SRPMからすればいけるんですね。 ありがとうございます。 バグではなくこれからこのやり方がデフォルトになったってわけじゃないんですよね?