我正试图覆盖4.5.1-1-ARCH上的开放系统调用,运气不佳。我没有错误,但是从不调用custom_open函数,所以它实际上没有被覆盖。
代码:
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kallsyms.h>
#include <asm/unistd.h>
#include <linux/uaccess.h>
MODULE_LICENSE("GPL");
static void **sys_call_table = NULL;
static asmlinkage long (*old_open) (const char __user *filename, int flags, umode_t mode);
static asmlinkage long custom_open(const char __user *filename, int flags, umode_t mode)
{
printk(KERN_INFO "Custom open invoked");
return old_open(filename, flags, mode);
}
static int init(void)
{
sys_call_table = (void *)kallsyms_lookup_name("sys_call_table");
pr_info("sys_call_table address: %p\n", sys_call_table);
old_open = sys_call_table[__NR_open];
sys_call_table[__NR_open] = custom_open;
pr_info("Original open: %p; New open: %p\n", old_open, custom_open);
return 0;
}
static void exit(void)
{
pr_info("exit");
sys_call_table[__NR_open] = old_open;
}
module_init(init);
module_exit(exit);
加载模块后,我在dmesg中得到以下内容:
[ 8027.331315] sys_call_table address: f97fe204
[ 8027.331320] Original open: (null); New open: f97fc000
答案 0 :(得分:1)
您声明了一个本地符号sys_call_table。
难道你不认为旧的开放是空的吗?更有趣的是,sys_call_table符号的找到地址与custom_open的地址相差不远。这是一个强烈的暗示,你发现的是你自己的sys_call_table符号的地址。'
你想要达到什么目标?
作为附注,我刚刚确认支持syscall表的页面是以只读方式映射的,所以如果仅仅写入没有使内核崩溃,那么你知道你没有找到它。
编辑:
所以,我检查了arch配置,本地查找可能是CONFIG_KALLSYMS_ALL未设置的副作用。这也意味着kallsyms将无法找到你想要的符号,但这并不重要。
http://maitesin.github.io/Module_prank/处的模块质量不合格,不得使用。我前段时间遇到过这个问题并解释了这里的主要缺陷:https://www.reddit.com/r/programming/comments/4b757p/linux_kernel_module_example_rickroll_prank/d16q5v5
由于你只是在玩,这种活动没用,特别是在这个阶段。我只能建议你暂时坚持用户空间。