在现代内核上查找不带符号的sys_call_表的地址

在现代内核上查找不带符号的sys_call_表的地址,c,linux-kernel,hook,C,Linux Kernel,Hook,我正试图开发一个KLM(内核可加载模块),它在linux(4.15.0-55-generic x86_64)下钩住系统调用,但我的问题是我找不到系统调用表(而不是ia32_系统调用表)的地址,我不想依赖带有kallsyms_查找名称的符号技术 我已经尝试过在一系列地址上使用迭代技术,但由于我不知道该从哪个地址开始迭代,我认为自己非法访问,我的KLM崩溃了 当谈到kallsyms_lookup_name的技术时,我拒绝采用它,因为它确实不可移植 我尝试过这种技术,但在我的内核上,她不工作,我尝试

我正试图开发一个KLM(内核可加载模块),它在linux(4.15.0-55-generic x86_64)下钩住系统调用,但我的问题是我找不到系统调用表(而不是ia32_系统调用表)的地址,我不想依赖带有kallsyms_查找名称的符号技术

我已经尝试过在一系列地址上使用迭代技术,但由于我不知道该从哪个地址开始迭代,我认为自己非法访问,我的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上没有相同的地址,当我使用此函数打印地址时,没有干净的机制来钩住系统调用,因此您必须找到一个黑客解决方案。一种可能性是,只需获取目标系统调用的地址,必要时(取决于平台)取消对内存页的保护,并向目标函数插入jmp指令。您还可以保存已覆盖的字节,以便在卸载模块时撤消此操作。

什么是“符号技术”<代码>不可移植-这没有意义,它是内核。内核代码本身只能移植到内核。内核接口也可以在内部更改。“可移植”部分涉及内核公开的内容,即POSIX。内核中的内容将保留在内核中。我看不出有什么问题,为什么你不想使用这个函数呢?没有干净的机制来钩住系统调用,所以你必须找到一个黑客解决方案。一种可能性是,只需获取目标系统调用的地址,必要时(取决于平台)取消对内存页的保护,并向目标函数插入
jmp
指令。您还可以保存您已覆盖的字节,以便在卸载模块时撤消此操作。是否有此技术的PoC?@movequ_\n我打赌有,但它非常简单,因此不需要PoC。您可以从用户空间中使用kpatch对活动内核进行修补,如果内核支持它。