如果地址存储为字符串,您可以将字符串转换为地址(可能通过uintptr_t
在<stdint.h>
或中定义<inttypes.h>
)。您获取字符串中的字节并移位并屏蔽它们以产生与地址等效的整数值,然后将地址分配给指针。
char *addresses = "\x32...";
char *string = addresses;
uintptr_t value = 0;
for (i = 0; i < sizeof(value); i++)
value = (value << 8) | (*addresses++ & 0xFF); // Sign extension avoided
void *memory_location = (void *)value;
我假设字符串中的第一个字节是地址的 MSB;如果(假设您使用的是 Intel)这是错误的(首先存储 LSB),则您必须调整循环以反转顺序——这是臭名昭著的“读者练习”观察之一。
或者你玩得又快又松,让筹码发挥作用。在 RISC 平台(非英特尔)上,这通常会导致 SIGBUS 错误;不过,有时您可能会很幸运。
char *addresses = "\x32...";
void *memory_location = (void *)(*(uintptr_t *)addresses);
这告诉代码将其char *
视为 a uintptr_t *
,取消引用它(一次读取整个字符串,除非地址未正确对齐,否则它将是两次提取,中间可能带有内核陷阱),然后分配值到内存位置。
如果您的代码有任何可移植性,请确保它位于“不可移植代码”部分。
这是所提出问题的技术解决方案(据我了解);不建议您使用它。