2011-09-01 98 views
1

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

  1. 我怎样才能获得module_list变量,如果它不是由内核导出(有没有这样的符号ksyms)?我可以看到所有调用lsmod命令的模块,所以我怎么才能在我的模块中得到它?
  2. 虽然我的模块正在运行,但它显示某些代码段已更改。它总是发生在某些图书馆。为什么会发生?我认为代码段是不变的。
  3. 是否可以控制内核模块的进程数据的内存访问以及如何执行?
+0

我不明白问题3.你是什么意思“是真的吗?”你想要什么样的控制? –

+0

简单地说,我想控制一些任务修改它自己的数据或代码的事实 –

回答

4

完全支持自修改代码。它没有什么不对,它被用于各种各样的事情。你认为代码不变是不正确的。它可能是,但它可能不是。

一个典型的例子是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,如果你真的想。

+0

我的内核不会导出这样的符号 –

+0

然后修改它以便它。这是开源软件的伟大之处。 (什么版本?它导出了什么?grep为“模块”或“符号”。) –

+0

除了指令替代方法外,还有一些跟踪/调试工具依赖修改内核本身的内存映像和模块。内核标记和Ftrace是第一个想到的。例如,Ftrace(在x86上)可能会在每个函数的前言('call mcount')之后用其他函数的调用永久替换剩余的5个字节以收集必要的数据。 – Eugene