从C中的物理内存地址读取结构

这可能是我缺乏C知识的更多问题,但我希望有人能够提供可能的解决方案。 简而言之,我试图读取存储在内存中的结构,并且我有它的物理内存地址。 这也是在64位Linux系统(Debian(Wheezy)Kernel 3.6.6)上完成的,我想用C语言。

例如,所讨论的结构体的当前地址是物理地址:0x3f5e16000

现在我最初尝试通过使用指向/ dev / mem的指针访问此地址。 但是,我从那以后就知道,不允许访问任何大于1024MB的地址,并且我在var / log / messages中收到一条很好的错误消息,告诉我所有关于它的信息。 目前正在尝试从用户空间应用程序访问,但如果这是必需的,我很乐意研究编写内核模块。

有趣的是,我还发现了一种被称为'kprobe'的东西,它可以让1024MB / dev / mem的限制被绕过。 但是,我并不想将任何潜在的安全问题引入到我的系统中,我相信必须有一种更简单的方法来实现此目的。 有关kprobe的信息可以在这里找到:http://www.libcrack.so/2012/09/02/bypassing-devmem_is_allowed-with-kprobes/

我已经做了一些阅读,并且我已经找到了使用mmap将物理地址映射到用户空间以便可以读取的参考,但是我必须承认我不了解C中的这个实现。

如果任何人都可以提供有关访问物理内存的信息,或者将数据从物理地址映射到用户空间虚拟地址,我将非常感激。

如果我对我的工作有些模糊,那么你必须原谅我,但是这是项目的一部分,我不想提供太多信息,所以请耐心等待:)我不是懒惰或任何东西。

内存中的结构是一个由四个整数和十个长整数组成的块,由正在运行的内核模块加载到内存中。

我使用的地址绝对是一个物理地址,它被设置为非分页,内核模块执行翻译为物理地址,我不使用地址 - 运算符。

我想知道如果我应该只是将问题改写为如何从物理位置读取int,因为这是结构的第一个元素。 我希望这有助于澄清事情!

编辑 - 在做了更多的读取之后,看起来这个问题的一个可能的解决方案是构建一个内核模块,然后使用mmap函数将物理地址映射到内核模块可以访问的虚拟地址。 任何人都可以提供任何建议,以实现这一点使用mmap?


我只会回答这个问题:

我想知道如果我应该只是将问题改写为如何从物理位置读取int,因为这是结构的第一个元素。

不是。问题不是intstruct ,问题是C本身没有物理内存的概念。 操作系统与MMU一起确保每个进程(包括每个正在运行的C程序)都运行在虚拟内存沙箱中。 操作系统可能会提供一个逃离物理内存的机会。

如果你正在编写一个管理物理地址为0x3f5e16000对象的内核模块,那么你应该提供一些API来访问该内存,最好是使用文件描述符或其他抽象来隐藏内核内存管理的基本内容来自与之通信的用户程序。

如果你试图与设计不佳的内核模块进行通信,该模块希望你访问固定的物理内存地址,那么涉及/dev/mem难看黑客就是你的共享。

链接地址: http://www.djcxy.com/p/70319.html

上一篇: Read struct from physical memory address in C

下一篇: Proper freeing and unmapping of kernel memory