カーネル レベルでシステム コールをインターセプトしようとしています。この質問から基本的なアイデアを得ました。私が傍受しようとしていたシステムコールはfork()でした。そこで、System.map からsys_fork()のアドレスを調べたところ、0xc1010e0c であることがわかりました。以下のようにモジュールを記述しました。
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/unistd.h>
#include<linux/semaphore.h>
#include<asm/cacheflush.h>
MODULE_LICENSE("GPL");
void **sys_call_table;
asmlinkage int (*original_call)(struct pt_regs);
asmlinkage int our_call(struct pt_regs regs)
{
printk("Intercepted sys_fork");
return original_call(regs);
}
static int __init p_entry(void)
{
printk(KERN_ALERT "Module Intercept inserted");
sys_call_table=(void *)0xc1010e0c;
original_call=sys_call_table[__NR_open];
set_memory_rw((long unsigned int)sys_call_table,1);
sys_call_table[__NR_open]=our_call;
return 0;
}
static void __exit p_exit(void)
{
sys_call_table[__NR_open]=original_call;
set_memory_ro((long unsigned int)sys_call_table,1);
printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);
ただし、モジュールをコンパイルした後、カーネルに挿入しようとすると、dmesg の出力から次のようになりました。
もちろん、システムコールをインターセプトしていません。問題を解決するのを手伝ってもらえますか? Linux カーネルの3.2.0-4-686バージョンを使用しています。