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