在C/C++中,如何在虚拟内存空间中获取数据?

att*_*tis 0 c c++ memory pointers

我正在使用调试信息.我试图编写类似"调试信息解析器",我使用DWARF和ELF库来执行此操作,但除了内存空间的信息之外,它们不提供任何内容,我试图获取该内存空间中的数据.我迷上了这个节目.我正在使用一个名为Pin的工具,所以我实际上在其他程序中运行代码.这就是为什么我可以访问它的变量.

假设我有一个指向地址的指针,我想获得存储在该地址和接下来的4个字节中的所有数据(例如).

举一个例子,假设我有一个地址0xDEADBEEF,我想从该地址开始经过接下来的4个字节并读取数据(取消引用每个字节上的指针)

我对C比较陌生,我试图做的是:

char * address = "0xDEADBEEF";
unsigned int bytesize = 4;

ptr = (void *) address;
ptr_limit = ptr + bytesize;

for(ptr; ptr < ptr_limit; ptr++)
     cout << ptr;
Run Code Online (Sandbox Code Playgroud)

我知道这可能是完全错误的,我得到了很多编译错误,但它只是展示了我想要使用的一些逻辑......

Nic*_*las 7

好的,C和C++是低级别的,但它们不是狂野的西部.您不能只是组成一个地址并访问它.大多数操作系统都不允许在汇编中执行此操作; 这就是SegFaults的来源.

获得记忆的方式是分配它.此过程涉及告诉操作系统您需要一些大小的内存.此时,操作系统会执行其操作,以便您可以访问特定范围的虚拟内存.尝试访问此范围之外的内存(或操作系统允许您访问的任何范围)将导致操作系统终止您的程序.

在C中,您通常使用malloc/ calloc/ realloc来分配内存并free告诉操作系统您已完成它.C++用于new分配对象并delete释放它们.

我试图编写类似"调试信息解析器",我使用DWARF和ELF库来执行此操作,但除了内存空间的信息之外,它们不提供任何内容,我试图获取该内存空间中的数据

如果你把这样的东西放在你的问题中,那就太棒了.

在任何情况下,你都在谈论访问别人的记忆,这是没有做到的.嗯,标准C和C++规则不允许这样做.各种操作系统都有调用,可以让您将其他进程的某些地址空间映射到您的上.但这更复杂,特定于操作系统.