天使と悪魔選手権

度々すみません。
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' から出ます


長文で申し訳ありませんが、お力をお貸しください。
宜しくお願いします。

A 回答 (1件)

回答がつかないようですので、簡単に。


Linux-2.6.xではsys_call_tableはセキュリティ上の理由からexportされなくなっていますので、モジュールから利用することは出来ません。下記のURLにいくつか対処方法が載っています。実験用なら試してみても良いと思いますが、実運用マシンに使うのは避けてください。

参考URL:http://dsas.blog.klab.org/archives/51291566.html
    • good
    • 0
この回答へのお礼

ありがとうございました。
いろいろ試してみましたが、LKMでシステムコールをフックするのは控えた方が良さそうな印象でした。
直接カーネルを書き換えるか、LSMで実装してみようと思います。

お礼日時:2009/03/03 20:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!