【问题标题】:kernel symbols in kernel module内核模块中的内核符号
【发布时间】:2014-03-01 10:17:47
【问题描述】:

首先我需要知道System.map/proc/kallsyms 中的地址是虚拟的还是物理的? 然后我想读取内核符号的地址,例如我想读取init_task 符号的pid 字段。我可以从System.map 找到init_task 地址以及pid 的偏移量。但我不知道如何从内核中的地址读取。 我非常感谢任何详细说明的参考或链接,因为我不熟悉内核编程。

另一个问题:当他们说DKOM(动态内核对象操作)是什么意思?我搜了一下,只是找到了一些关于windows系统的东西!

当他们说您可以在LKM 中访问exported symbols 时?它们是什么操作?是从内核符号中读取或写入的特定函数吗?

【问题讨论】:

    标签: module linux-kernel symbols reloadable


    【解决方案1】:

    首先,System.map/proc/kallsyms 中的地址是虚拟地址。

    其次,如果你想在内核中遍历数据结构,你可以使用Crash tool。它基于gdb,易于使用。但是你应该先用调试信息重新编译你的内核。使用崩溃工具,您可以轻松读取用户空间中内核的每个数据结构。它支持多种发行版,例如 Ubuntu、Fedora 等。

    另一个工具是Volatility,由 Python 编写,您可以拍摄系统快照。然后用 Volatility 读取内存快照。

    【讨论】:

      【解决方案2】:

      几乎任何你能看到的指针地址都是虚拟的。它要么是用户空间进程虚拟空间(即您的进程),要么是内核虚拟地址空间。只有当内核需要通知一个硬件组件如何访问另一个硬件组件时,它才会将指针转换为物理表示。

      值得注意的是,物理地址空间是虚拟的,因为不同的硬件组件被实用地分配了内存范围,并且预计在处理这些内存范围时会做出反应。从某种意义上说,它仍然是非常物理的,因为这些地址值是在 BUS 地址上编码的,不需要软件翻译。

      关于从用户空间读/写内核指针。除非由特定 API 授予并由用户和内核设置(如共享内存),否则您不能。它是蚀刻在操作系统核心中的最基本的安全保护。 (您甚至无法访问其他用户的内存)。

      话虽如此,如果您希望有意降低内核安全性,那么作为 root 用户您几乎可以执行任何操作,包括加载执行此操作的模块...

      这是关于同一主题的另一个讨论: how-to-access-kernel-space-from-user-spacein-linux

      【讨论】:

        猜你喜欢
        • 2017-03-18
        • 2012-08-06
        • 1970-01-01
        • 2012-02-26
        • 2018-03-06
        • 1970-01-01
        • 2015-04-02
        • 2012-03-14
        • 2012-03-10
        相关资源
        最近更新 更多