1

所以,我有一个unsigned int变量,上面存储了一个十进制值地址,比方说unsigned int var = 1232342,我想做的是,在不知道变量的类型知道它的大小和存储地址的情况下,获取值作为一个byte array. 例如,假设我有一个int var = 20地址和字节大小。我希望能够转到该地址并返回一个字节数组,在这种情况下[00001100],对于char结构的变量和数据成员也是如此。

一点点伪代码将类似于:

for var.address until var.address = var.address + bytesize
    do 
       byte_array = *var.address
       var.address++ 

不过我遇到了一些问题,我对 C 有点陌生,所以我不知道如何将 unsigned int 视为地址/指针。其次,我不知道如何从地址中获取实际字节,每当我取消引用地址时,我得到的是它的实际值,但前提是我知道变量的类型。

一点背景知识: 我正在开发一个名为 Pin 的工具,它让我可以选择挂钩到正在运行的进程,然后我正在使用 DWARF 和 ELF 信息。所以我确实可以访问我试图访问的虚拟内存空间

4

2 回答 2

1

看看epatel here的hexdump功能

现成的 C++ 十六进制转储代码

尽管有标题,但它实际上是 C 代码。为了您的方便,我会复制到这里

#include <ctype.h>
#include <stdio.h>

void hexdump(void *ptr, int buflen) {
  unsigned char *buf = (unsigned char*)ptr;
  int i, j;
  for (i=0; i<buflen; i+=16) {
    printf("%06x: ", i);
    for (j=0; j<16; j++) 
      if (i+j < buflen)
        printf("%02x ", buf[i+j]);
      else
        printf("   ");
    printf(" ");
    for (j=0; j<16; j++) 
      if (i+j < buflen)
        printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.');
    printf("\n");
  }
}
于 2012-09-27T03:09:55.523 回答
1

“a”是您想要获取 4 个字节的地址。“字节”是您要存储结果的位置。我将“i”的地址分配给“a”,然后从该地址读取 4 个字节。

#include <stdio.h>
int main(int argc, char *argv[]) {
    unsigned char bytes[4];
    int i = 65535, j;
    unsigned long a = (unsigned long) &i;

    for (j = 0; j < 4; j++) {
        bytes[j] = *((unsigned char*) a + j);
    }

    for (j = 0; j < 4; j++) {
        printf("bytes[%d]: %d\n", j, bytes[j]);
    }
}
于 2012-09-26T22:48:41.193 回答