拦截系统调用

Pau*_*esC 5 linux kernel linux-kernel

我一直试图在内核级别挂钩系统调用.我从这个问题得到了基本的想法.我试图拦截的系统调用是fork().所以我发现了sys_call_tablefrom 的地址,System.map结果证明是0xc12c9e90.现在我写的模块如下.

#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;
unsigned long addr;
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)
{
       struct page *pg;
       printk(KERN_ALERT "Module Intercept inserted");
       sys_call_table=(void *)0xc12c9e90;
       pg=virt_to_page(sys_call_table);
       addr=(unsigned long)page_address(pg);
       set_memory_rw(addr,1);
       original_call=sys_call_table[__NR_fork];
       sys_call_table[__NR_fork]=our_call;
       set_memory_ro(addr,1);
       return 0;
}
static void __exit p_exit(void)
{
       sys_call_table[__NR_fork]=original_call;
       set_memory_ro(addr,1);
       printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);
Run Code Online (Sandbox Code Playgroud)

我编译了模块并尝试将其插入内核.不幸的是,dmesg输出给了我一条消息如下BUG:无法在c12c9e98处理内核分页请求,这里是ellaborate dmesg out put

在此输入图像描述 在此输入图像描述

作为一个找出问题的实验,我只是评论了这一行

sys_call_table[__NR_fork]=our_call;
Run Code Online (Sandbox Code Playgroud)

之后我重复编译,然后插入.它没有显示任何错误.所以我得出结论,将上述新函数分配给sys_call_table的上述指定行是问题所在.但我不知道是什么原因导致它以及如何解决它.任何人都可以帮助我解决它吗?