我正在尝试开发一个 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/