Linux内核模块检查内存完整性

时间:2011-09-01 09:21:03

标签: linux memory kernel kernel-module integrity

我正在编写一个内核模块,通过控制校验和来检查代码段的完整性以便运行任务。我遇到了几个障碍:

  1. 如果module_list变量没有被内核导出(ksyms中没有这样的符号),我如何获取它?我可以看到调用lsmod命令的所有模块,所以如何在模块中获取它?
  2. 当我的模块运行时,它显示某些代码段已更改。它总是发生在某些库中。为什么会这样?我认为代码段是不变的。
  3. 是否可以控制内核模块的进程数据的内存访问以及如何进行?

1 个答案:

答案 0 :(得分:5)

完全支持自我修改代码。它没有任何问题,它被用于各种各样的事情。您认为代码是常量的假设是不正确的。它可能是,但可能不是。

一个典型的例子是SMP与UP系统。例如,在Pentium 4类Xeon机器上,解锁增量可比锁定增量少60个周期。仅在SMP计算机上需要锁定的增量。为了使相同的代码在UP和SMP机器上工作而没有运行时条件的开销,通常使用自修改代码。在lock指令的位置,使用了诸如ud2的非法操作码。捕获到非法指令中断,并且ud2在SMP系统上由lock替换,在UP系统上由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