-4

这是从 Linux x86 系统上的某人的角度来看的。是否可以在指针中存储硬编码地址以外的内容?不过这里有一个问题:要存储在指针中的值以前会存储为字符串。很确定我无法引用任何寄存器或其他指针,但我只是想确定一下。我知道人们会问我为什么要做这样的事情;解释起来需要很长时间,我绝对确定没有替代解决方案。

灵魂添加了这个:

    char* addresses = "\x32\x45\x19..."

我想在“地址”中存储硬编码地址以外的东西。

编辑:

大声笑哇,我以为我很清楚。我有一个字符数组,一个指针,或者我称之为:一个字符串。这个字符串将在 PHP 中被视为 ZVAL 结构。我想知道是否可以在字符串中存储硬编码地址以外的信息。

4

2 回答 2

0

如果地址存储为字符串,您可以将字符串转换为地址(可能通过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 *,取消引用它(一次读取整个字符串,除非地址未正确对齐,否则它将是两次提取,中间可能带有内核陷阱),然后分配值到内存位置。

如果您的代码有任何可移植性,请确保它位于“不可移植代码”部分。

这是所提出问题的技术解决方案(据我了解);不建议您使用它。

于 2012-06-07T23:55:27.273 回答
0

你说“哇,我以为我很清楚。我有一个字符数组,一个指针,或者我称之为:一个字符串。这个字符串将在 PHP 中被视为 ZVAL 结构。我想知道我是否可以在字符串中存储硬编码地址以外的信息。”

不是你这样做的方式。

 char * addresses = "\x32\x45\x19..." ;
 addresses is set to point to something you should not change.

你需要为这些东西分配存储空间。

例如

 char stuff [256] ;
 char * addresses = stuff;
 memcpy(stuff,"\x32\x45\x19...",sizeof("\x32\x45\x19..."));
于 2012-06-08T00:06:26.640 回答