gpt4 book ai didi

c - 可加载内核模块编程和系统调用拦截

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:55 27 4
gpt4 key购买 nike

假设我们想要拦截退出系统调用,并在任何进程调用它时在控制台上打印一条消息。为了做到这一点,我们必须编写自己的假退出系统调用,然后让内核调用我们的假退出函数而不是原来的退出调用。在我们的假退出调用结束时,我们可以调用原始退出调用。为了做到这一点,我们必须操纵系统调用表数组(sys_call_table)。有了 sys_call_table 数组,我们可以对其进行操作,使 sys_exit 入口点指向我们新的假退出调用。我们必须存储一个指向原始 sys_exit 调用的指针,并在我们完成将消息打印到控制台时调用它。源代码:

 #include <linux/kernel.h>
#include <linux/module.h>
#include <sys/syscall.h>

extern void *sys_call_table[];

asmlinkage int (*original_sys_exit)(int);

asmlinkage int our_fake_exit_function(int error_code)
{
/*print message on console every time we
*are called*/
printk("HEY! sys_exit called with error_code=%d\n",error_code);

/*call the original sys_exit*/
return original_sys_exit(error_code);
}

/*this function is called when the module is
*loaded (initialization)*/
int init_module()
{
/*store reference to the original sys_exit*/
original_sys_exit=sys_call_table[__NR_exit];

/*manipulate sys_call_table to call our
*fake exit function instead
*of sys_exit*/
sys_call_table[__NR_exit]=our_fake_exit_function;
}


/*this function is called when the module is
*unloaded*/
void cleanup_module()
{
/*make __NR_exit point to the original
*sys_exit when our module
*is unloaded*/
sys_call_table[__NR_exit]=original_sys_exit;
}

当我编译这个程序时,我收到了警告:

WARNING: "sys_call_table" [/home/roiht/driver/one.ko] undefined!

我搜索了一下,发现2.5以后的内核版本改变了sys_call表的概念。所以,我的问题是在新内核版本中执行此操作的替代方法是什么?

最佳答案

如果已使用 EXPORT_SYMBOL() 在内核中显式导出任何内核变量,则可以在模块中使用它。自内核版本 2.6 起,已删除 sys_call_table 的导出。因此,如果您想使用这种方法,请显式导出变量。按照惯例,theis export 是在变量声明之后立即完成的,但我想从任何定义了这个变量的文件中导出也可以。要检查该方法是否有效,只需查看“cat/proc/kallsyms”的输出即可。

另一种捕获退出系统调用的方法是在系统调用执行的 sysenter 部分放置一个钩子(Hook)。在这里查看更多详细信息:http://articles.manugarg.com/systemcallinlinux2_6.html

关于c - 可加载内核模块编程和系统调用拦截,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12613301/

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