【发布时间】:2021-01-08 21:26:23
【问题描述】:
我正在尝试从 linux 内核自定义模块中挂钩系统调用。
模块已加载,但 printk 似乎没有从新函数向 dmesg 打印任何内容。
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/unistd.h>
#include <linux/kallsyms.h>
void **sys_call_table;
int (*original_call) (const char*, int, mode_t);
int our_sys_open(const char* file, int flags, mode_t mode)
{
printk(KERN_INFO "A file was opened\n");
return original_call(file, flags, mode);
}
void set_addr_rw(unsigned long addr)
{
unsigned int level;
pte_t *pte = lookup_address(addr, &level);
if (pte->pte &~ _PAGE_RW) pte->pte |= _PAGE_RW;
}
void set_addr_ro(unsigned long addr)
{
unsigned int level;
pte_t *pte = lookup_address(addr, &level);
pte->pte = pte->pte &~_PAGE_RW;
}
int init_module()
{
printk("Loading custom module\n");
sys_call_table = (void *) kallsyms_lookup_name("sys_call_table");
original_call = sys_call_table[__NR_open];
set_addr_rw((unsigned long) sys_call_table);
sys_call_table[__NR_open] = our_sys_open;
return 0;
}
void cleanup_module()
{
printk("Unloading custom module\n");
// Restore the original call
sys_call_table[__NR_open] = original_call;
set_addr_ro((unsigned long) sys_call_table);
}
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("OTO");
MODULE_VERSION("0.1");
我尝试打开/关闭系统上的文件,但在/var/log/kern.log 中没有任何痕迹。
我的代码主要基于来自 thread 的信息。
编辑:我还可以给出模块加载前后的 sys_call_table 条目:
crash> x/1g &sys_call_table[2]
0xffffffffb7c013b0: 0xffffffffb6eda7e0
模块加载后:
crash> x/1g &sys_call_table[2]
0xffffffffb7c013b0: 0xffffffffc06d508f
所以,变化实际上正在发生。
【问题讨论】:
-
尝试对同一目录中的部分
printk()字符串运行grep。运行dmesg有什么有趣的输出吗?你也可以查看控制台输出吗? -
grepping 没有给出任何结果,
dmesg和tail /var/log/kern.log给出了相同的结果:“正在加载自定义模块”(来自 init_module),仅此而已。还有,控制台输出是什么意思?
标签: c linux-kernel hook