2

由于我缺乏 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 实现这一点提供任何建议吗?

4

1 回答 1

4

我只回答这个问题:

我想知道是否应该将问题重新表述为如何从物理位置读取 int ,因为这是结构的第一个元素。

不,问题不在于intvs. struct,问题在于 C 本身并没有物理内存的概念。操作系统与 MMU 一起确保每个进程,包括每个正在运行的 C 程序,都在虚拟内存沙箱中运行。操作系统可能会提供进入物理内存的逃生口。

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

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

于 2013-01-10T20:49:44.063 回答