在(或之后?)2.4 中,sys_call_table
符号不再被导出,从而使挂钩系统调用变得更加困难。
忽略您仍然可以从 IDT 或通过阅读 获取此信息/boot/System.map-<kernel-version>
,我想知道为什么此地址在重新启动和机器(具有相同内核版本)之间似乎是恒定的?难道不值得让它变得动态吗?是否有理由要求它是静态的?
我的目标是这样的:
sys_call_table
不再导出到模块以使挂钩系统调用更加困难,但模块(即内核空间程序)仍然可以轻松地通过读取System.map
或简单地根据内核版本信息进行猜测来获取此信息,因为地址似乎与所有机器都运行相同版本的内核。
答案1
从内核版本 4.8 开始,至少在 x86 上,内核地址空间是随机的,包括系统调用表的地址。看RANDOMIZE_BASE
在内核配置中了解基本细节。
这意味着给出的地址System.map
是无用的,系统调用表的地址在每次启动时都会改变。如果您需要调试某些东西并想使用System.map
,则需要使用nokaslr
内核命令行参数启动以禁用 KASLR。