将无符号int地址视为指针,并将其解引用为字节数组

Treating an unsigned int address as a pointer and dereferencing it as a byte array

本文关键字:引用 字节 数组 字节数 int 无符号 地址 指针      更新时间:2023-10-16

所以,我有一个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有点陌生,所以我不知道如何将无符号int视为地址/指针。其次,我不知道如何从地址中获得实际字节,每当我取消引用地址时,我得到的是它的实际值,但前提是我知道变量的类型。

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

在中查看epatel的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");
}
}

"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]: %dn", j, bytes[j]);
}
}