【发布时间】:2019-12-28 07:16:34
【问题描述】:
我正在尝试开发一个 KLM(内核可加载模块),它在 linux(4.15.0-55-generic x86_64)下挂钩系统调用,但我的问题是我找不到 sys_call_table 的地址(而不是ia32_sys_call_table),我不想依赖 kallsyms_lookup_name 的符号技术
我已经尝试过对一系列地址进行迭代的技术,但由于我真的不知道从哪个地址开始迭代,我将自己视为非法访问,并且我的 KLM 崩溃了 ..
当使用 kallsyms_lookup_name 的技术时,我拒绝采用它,因为它真的不便携..
我尝试过这种技术,但在我的内核上她不起作用,我尝试过这个功能:
int search_sct(void) {
sys_call_table = (void *)kallsyms_lookup_name("sys_call_table");
if (sys_call_table == NULL) {
printk(KERN_ERR "Couldn't look up sys_call_table\n");
return -1;
}
return 0;
}
我在 /boot/System.map 上没有相同的地址,当我用这个函数打印地址时
【问题讨论】:
-
什么是“符号技巧”?
not portable- 这没有意义,它是内核。内核代码本身只能移植到内核。内核接口也可以在内部发生变化。 “可移植”部分涉及内核公开的内容,即。 POSIX。内核中的内容保留在内核中。我看不出kallsyms_lookup_name 有什么问题,你为什么不想使用那个功能? -
没有干净的机制来挂钩系统调用,所以无论如何你都必须找到一个骇人听闻的解决方案。一种可能性是,简单地获取目标系统调用的地址,如有必要(取决于平台)取消保护内存页面并将
jmp指令插入目标函数。您还可以保存已覆盖的字节,以在模块卸载时撤消此操作。 -
有这种技术的 PoC 吗?
-
@movequ_clevereverse 我敢打赌,但它非常简单,因此不需要 PoC
-
如果内核支持,您可以从用户空间使用 kpatch 修补实时内核。
标签: c linux-kernel hook