如何从/proc/kcore
检索系统调用地址。我可以从System.map
文件中获取系统调用表地址。
答案 0 :(得分:9)
如果您使用的是基于x86的计算机,则可以使用sidt
指令获取中断描述符表寄存器,从而获取中断描述符表本身。有了这些,您可以获得0x80系统调用中断调用的system_call
(或x86-64兼容性的ia32等效)函数的地址。反汇编中断处理程序并扫描特定的间接调用指令,可以在调用指令中提取地址。该地址是您的系统调用表(在x86上)或x86-64上的IA32兼容性系统调用表。
获取x86-64本机系统调用表是类似的:不是使用sidt
重建中断表,而是读取处理器的IA32_LSTAR MSR。 (high << 32 | low)
处的地址是系统调用调度程序。像以前一样扫描内存,从调用指令中提取sys_call_table
地址,但记得屏蔽地址的高32位。
这掩盖了一些很多的更多技术信息(比如要搜索的字节),你应该在内核代码中探讨之前理解这些信息。快速搜索谷歌后,我发现整个过程都已记录(使用示例模块代码)here。
祝你好运,尽量不要惹恼自己!