度々すみません。
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' から出ます
長文で申し訳ありませんが、お力をお貸しください。
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
回答がつかないようですので、簡単に。
Linux-2.6.xではsys_call_tableはセキュリティ上の理由からexportされなくなっていますので、モジュールから利用することは出来ません。下記のURLにいくつか対処方法が載っています。実験用なら試してみても良いと思いますが、実運用マシンに使うのは避けてください。
参考URL:http://dsas.blog.klab.org/archives/51291566.html
ありがとうございました。
いろいろ試してみましたが、LKMでシステムコールをフックするのは控えた方が良さそうな印象でした。
直接カーネルを書き換えるか、LSMで実装してみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
kernel 2.4.XX.ELsmp のELって?
-
Windows Vistaは本当にゴミOSな...
-
/dev/nvme0n1p2 clean と表示さ...
-
カーネルメモリをすべて物理メ...
-
システム起動時のブートファイ...
-
LinuxをOSとして使えるマザーボ...
-
カーネルの再構築とは?
-
自作OSの良本
-
Linuxでの10msスリープ
-
Linuxカーネルのコンパイルヘッ...
-
カーネルとはどんな意味ですか?
-
Linuxって何?
-
デュアルCPUのマシンにRedHat9...
-
ザウルス(SL-C1000)で有線LAN...
-
SolarisとLinuxの違い
-
UNIXからLINUXへのデータ移行に...
-
レッドハットのバージョン確認方法
-
フェイクRAIDとソフトウェアRAI...
-
カーネルアップグレード後、una...
-
魔改造版Windows 2000をインス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
/dev/nvme0n1p2 clean と表示さ...
-
Linux 32Bitと64Bitのメモリー...
-
カーネルバッファとは何でしょうか
-
SolarisとLinuxの違い
-
romfsってなんですか?
-
カーネルアップグレード後、una...
-
SunOS5.x と Solarisの違いは?
-
UNIXとBSDとLinuxの違いを小学...
-
エラー”Illegal seek”はどんな...
-
BSDでフォーマットされたHDDは...
-
パフォーマンスモニタの%Proces...
-
違いを教えください!!
-
Windows Vistaは本当にゴミOSな...
-
Dockerコンテナ(centos7.9)の...
-
魔改造版Windows 2000をインス...
-
kernel 2.4.XX.ELsmp のELって?
-
Debian で時間が経つと画面が消...
-
割り込み不可能?なプロセスを...
-
/proc/sys/net/ipv4/route/flus...
-
デュアルコアCPUをシングルにし...
おすすめ情報