gpt4 book ai didi

c - 内核模块系统调用覆盖

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:02 24 4
gpt4 key购买 nike

我试图覆盖 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

最佳答案

您声明一个局部符号 sys_call_table。

你不觉得老open为null很可疑吗?更有趣的是,找到的 sys_call_table 符号的地址与 custom_open 的地址相差不远。这是一个强烈的暗示,表明您找到的是您自己的 sys_call_table 符号的地址。'

你想达到什么目的?

作为旁注,我刚刚验证了支持系统调用表的页面被映射为只读,因此如果单纯的写入没有导致内核崩溃,您就知道您没有找到它。

编辑:

所以,我检查了 arch config,本地查找可能是 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

既然你只是在玩,这种事件是没有用的,尤其是在这个阶段。我只能建议您暂时坚持使用用户空间。

关于c - 内核模块系统调用覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com