【发布时间】:2022-12-11 03:50:59
【问题描述】:
来自 Windows 世界,我假设 Vmlinuz 等同于 ntoskrl.exe,这是映射到内核内存中的内核可执行文件。
现在我想弄清楚内核中的地址是否属于内核可执行文件。使用 core_kernel_text 是找出这个问题的正确方法吗? 因为 core_kernel_text 对于一些显然应该属于 Linux 内核可执行文件的地址没有返回 true。
例如,当我给 core_kernel_text 提供系统调用入口处理程序地址时,core_kernel_text 不会返回 true,可以通过以下方式找到该地址:
unsigned long system_call_entry;
rdmsrl(MSR_LSTAR, system_call_entry);
return (void *)system_call_entry;
当我使用带有该地址的 get_module_from_addr 时,系统调用入口处理程序的地址也不属于任何内核模块。
那么,一个明显属于 Linux 内核可执行文件(例如系统调用条目)的处理程序的地址怎么可能既不属于核心内核也不属于任何内核模块呢?那它属于什么? 对于这些明显属于 Linux 内核可执行文件的函数类型,我需要使用哪个 API 来向我保证该地址确实属于内核?
我需要这样一个 API,因为我需要编写一个检测恶意内核模块的补丁程序,现在我需要确保该地址属于内核,而不是某个第三方内核模块或随机内核地址。 (请不要讨论绕过我检测的方法,明明可以绕过那是另外一回事了)
【问题讨论】:
标签: linux-kernel kernel kernel-module