1

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

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

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

4

2 回答 2

2

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

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

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

话虽如此,如果您想故意降低内核安全性,那么作为 root 用户,您几乎可以做任何事情,包括加载一个执行此操作的模块......

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

于 2014-02-05T08:21:05.947 回答
2

首先,地址在System.map或是/proc/kallsyms虚拟地址。

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

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

于 2014-02-07T06:07:32.497 回答