我正在编写一个内核模块,通过控制校验和来检查运行任务的代码段的完整性。我遇到了几个障碍:
module_list
如果内核没有导出变量(中没有这样的符号),我如何获取变量ksyms
?我可以看到调用该lsmod
命令的所有模块,那么如何在我的模块中获取它?- 当我的模块正在运行时,它显示一些代码段已被更改。某些库总是会发生这种情况。为什么会这样?我认为代码段是不变的。
- 从内核模块控制进程数据的内存访问是否可行以及如何做到这一点?
我正在编写一个内核模块,通过控制校验和来检查运行任务的代码段的完整性。我遇到了几个障碍:
module_list
如果内核没有导出变量(中没有这样的符号),我如何获取变量ksyms
?我可以看到调用该lsmod
命令的所有模块,那么如何在我的模块中获取它?完全支持自修改代码。它没有任何问题,它被用于各种事情。您认为代码是恒定的假设根本不正确。可能是,但可能不是。
一个典型的例子是 SMP 与 UP 系统。例如,在 Pentium 4 级 Xeon 机器上,解锁增量可能比锁定增量少 60 个周期。只有在 SMP 机器上才需要锁定增量。为了使相同的代码在 UP 和 SMP 机器上工作而没有运行时条件的开销,通常使用自修改代码。代替lock
指令,使用非法操作码如ud2
。在 SMP 系统和UP 系统上,非法指令中断被捕获并被ud2
替换。lock
nop
内核导出一个模块接口。导出的有:
__module_text_address __symbol_get symbol_put_addr use_module
module_layout module_put __module_put_and_exit module_refcount
register_module_notifier __symbol_put unregister_module_notifier module_get
/proc/modules
如果你真的想要,你也可以解析。