【问题标题】:Linux kernel module to check memory integrity用于检查内存完整性的 Linux 内核模块
【发布时间】:2011-09-01 09:21:02
【问题描述】:

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

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

【问题讨论】:

  • 我不明白问题 3。“它是真的吗?”是什么意思?你想要什么样的控制?
  • 简单地说,我想控制一些任务修改它自己的数据或代码的事实

标签: linux memory kernel kernel-module integrity


【解决方案1】:

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

一个典型的例子是 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

【讨论】:

  • 我的内核不导出此类符号
  • 然后修改它。这就是开源软件的伟大之处。 (什么版本?它导出什么?Grep 表示“模块”或“符号”。)
  • 除了指令替代之外,还有一些跟踪/调试工具依赖于内核和模块的内存映像的修改。首先想到的是内核标记和 Ftrace。例如,Ftrace(在 x86 上)可能会在每个函数 (call mcount) 的序言​​之后永久替换留给它的 5 个字节,并调用它的其他函数以收集必要的数据。
  • 很遗憾,我的基于Linux的操作系统版本不是开源的,无法修改(俄罗斯军事os MCBC)
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2011-11-29
  • 2015-10-26
  • 2012-09-11
  • 1970-01-01
  • 2012-04-11
  • 2013-12-17
  • 2013-08-09
相关资源
最近更新 更多