※ ChatGPTを利用し、要約された質問です(原文:LKMを用いたカーネル2.6でのシステムコールのフック)
LKMを用いたカーネル2.6でのシステムコールのフック
このQ&Aのポイント
LKMを使ったシステムコールのフックに挑戦しているがうまくいかずに悩んでいる。
Debian 4.0r4ディストリビューションでカーネル2.6.24を使用している。
カーネルコンパイルの手順やプログラムの内容に関する質問をしている。
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' から出ます
長文で申し訳ありませんが、お力をお貸しください。
宜しくお願いします。
お礼
ありがとうございました。 いろいろ試してみましたが、LKMでシステムコールをフックするのは控えた方が良さそうな印象でした。 直接カーネルを書き換えるか、LSMで実装してみようと思います。