c - 在现代内核中查找不带符号的 sys_call_table 的地址

标签 c linux-kernel hook

我正在尝试开发一个 KLM(内核可加载模块),它在 linux(4.15.0-55-generic x86_64)下 Hook 系统调用,但我的问题是我找不到 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 上没有相同的地址,当我用这个函数打印地址时

最佳答案

没有干净的机制来 Hook 系统调用,因此您无论如何都必须找到一个 hackish 解决方案。一种可能性是,简单地获取目标系统调用的地址,必要时取消保护内存页面(取决于平台)并向目标函数插入 jmp 指令。您还可以保存已覆盖的字节,以在模块卸载时撤消此操作。

关于c - 在现代内核中查找不带符号的 sys_call_table 的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57456738/

相关文章:

c - 结构体数组占用内存过多

c - 如何使用Makefile在cygwin上编译cli-clock?

memory - 不可撤销的页面

Glassfish 钩

git hook 脚本输出添加了烦人的 "[K"后缀

使用 C 语言更改 BIOS 设置

c - arr[0] 的大小是多少?

linux - 在 Linux 上唤醒 cpu 调用哪个函数

debugging - 崩溃后查看内核日志

wordpress - 标签在 WordPress 中创建/编辑/删除 Hook