访问Linux 2.6.x下的任何内存位置

时间:2010-07-13 16:34:25

标签: linux memory assembly kernel

我在x86机器上使用Slackware 12.2。我试图通过转储特定的内存部分来调试/弄清楚事情。不幸的是,我对Linux内核的了解非常局限于编程/测试所需的内容。

所以这是我的问题:有没有办法访问内存中的任何一点?我尝试使用char指针执行此操作,以便它只有一个字节长。然而,该程序崩溃并吐出了一些性质:“无法访问内存位置”。现在我指的是0x00000000位置,系统存储它的中断向量(除非改变了),这实际上并不重要。

现在我的理解是内核将为程序分配内存(数据,堆栈,堆等),并且该程序将无法在其他任何地方运行。所以我在考虑使用NASM告诉CPU直接获取我需要的东西,但我不确定这是否有效(我需要弄清楚如何将MASM转换为NASM)。

好吧,这是我长篇大论的独白。基本上我的问题是:“有没有办法实现这个目标?”。

总之...

2 个答案:

答案 0 :(得分:5)

如果您的程序在用户模式下运行,那么您的进程内存外部的内存将无法通过钩子或骗子访问。使用asm无济于事,任何其他方法也无济于事。这根本不可能,并且是在受保护模式下运行的任何操作系统的核心安全性/稳定性功能(即所有操作系统,在过去20多年中)。 Here's a brief overview of Linux kernel memory management.

探索计算机的整个内存空间的唯一方法是使用内核调试程序,它允许您访问任何物理地址。但是,即使这样也不会让您同时查看每个进程的内存,因为某些进程将从主内存中换出。此外,即使在内核模式下,物理地址也不一定与进程可见的地址相同。

答案 1 :(得分:3)

看看/ dev / mem或/ dev / kmem(man mem) 如果你有root权限,你应该能够在那里看到你的记忆。这是内核调试程序使用的机制。

请注意警告:当存在只读位或只写位时,检查和修补可能会导致意外结果。

从手册页:

mem  is  a character device file that is an image of
the main memory of the computer.  It may be used, for
example, to examine (and even patch) the system.

Byte  addresses  in  mem  are interpreted as physical 
memory addresses. References to nonexistent locations 
cause errors to be returned.

...

The file kmem is the same as mem, except that the 
kernel virtual memory rather than physical memory is 
accessed.