当我想要 64 位时,函数返回 32 位地址

问题描述 投票:0回答:1

我正在使用一个用于反射 DLL 加载的库。这是我遇到问题的文件:

https://github.com/stephenfewer/ReflectiveDLLInjection/blob/master/inject/src/GetProcAddressR.c

最后一行:

return fpResult;

它包含我试图获取地址的函数的正确全长地址。

当我回到主程序时,如下所示:

PVOID address = GetProcAddressR(buffer, length);

地址被截断为 32 位数字。

0x00002023A83EFF30

变成

0xFFFFFFFA83EFF30

我检查了这个的拆解,它看起来像说明

CDQE 

正在打电话,这正是我遇到的问题。但是,我不确定上面链接的文件中的哪个位置导致了这些问题。

c pointers assembly
1个回答
0
投票

我只是因为自己的失败而偶然发现了这一点,也许这可以帮助那些像我一样在某些时候突然措手不及的人。 就我而言,我只是忘记包含实际声明我尝试使用的数据类型的标头。 在下面的示例中,应用程序在 VS2022 中构建良好,但没有报告任何错误或警告。虽然问题会出现在 main() 中,但变量 Sample 已被分配了由 sample_create() 实际返回的 64b 指针的 32b 值。 从技术/编译器的角度来看,这对我来说完全没问题,我只是错过了 VS 的警告,表明使用了未知类型。

请参阅以下简化示例。

样本.h:

#ifndef SAMPLE_H_
#define SAMPLE_H_
struct sample_s {
    int a;
    int b;
};
struct sample_s *sample_create(void);
#endif

样本.c

#include <stdlib.h>
#include "sample.h"
struct sample_s *sample_create(void) {
    struct sample_s *sample;
    sample = malloc(sizeof(struct sample_s));
    if(!sample)
        return NULL;

    return sample;
}

main.c

#include <stdio.h>
/** No include of sample.h caused the issue on my side */

int main() {
    struct sample_s *sample;
    sample = sample_create();
    free(sample);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.