首先,我需要知道System.map
或/proc/kallsyms
中的地址是虚拟的还是物理的?
然后我想从内核符号的地址读取,例如我想阅读pid
符号的init_task
字段。我可以从init_task
找到System.map
地址,也可以找到pid
的偏移量。但我不知道如何从内核中的地址读取。
我非常感谢任何参考或链接来详细说明事情,因为我不熟悉内核编程。
另一个问题:当他们说DKOM
(动态内核对象操作)时,它是什么意思?我搜索过但只是找到一些关于Windows系统的东西!
当他们说您可以访问exported symbols
中的LKM
时?他们的意思是什么?是从内核符号读取还是写入的特定函数?
答案 0 :(得分:2)
您可以看到的任何指针地址都是虚拟的。它既可以是用户空间进程虚拟空间(即您的进程),也可以是内核虚拟地址空间。只有当内核需要通知一个硬件组件如何访问另一个硬件组件时,它才会将指针转换为物理表示。
值得注意的是,物理地址空间是虚拟的,因为不同的硬件组件是实际分配的内存范围,并且在寻址时会发生反应。从某种意义上讲,它仍然是非常物理的,这些地址值是在BUS地址上编码的,不需要软件转换。
从用户空间读取/写入内核指针。除非由用户和内核(如共享内存)通过特定API和设置授予,否则您无法。它是蚀刻到操作系统核心的最基本的安全保护。 (你甚至无法访问另一个用户的内存)。
话虽如此,如果你想故意降低你的内核安全性,你可以做任何事情,包括加载一个那样做的模块......
这是关于同一主题的另一个讨论: how-to-access-kernel-space-from-user-spacein-linux
答案 1 :(得分:1)
首先,System.map
或/proc/kallsyms
中的地址是虚拟地址。
其次,如果您想在内核中遍历数据结构,可以使用Crash tool。它基于gdb,易于使用。但是您应该首先使用调试信息重新编译内核。使用崩溃工具,您可以轻松读取用户空间中内核的每个数据结构。它支持多种发行版,如Ubuntu,Fedora等。
另一个工具是Volatility,由Python编写,您可以拍摄系统的快照。然后用Volatility读取内存快照。