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

pqwbnv8z  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(53)

我正在使用一个用于反射DLL加载的库。下面是我遇到问题的文件:
https://github.com/stephenfewer/ReflectiveDLLInjection/blob/master/inject/src/GetProcAddressR.c
最后一行:

return fpResult;

字符串
它包含我试图获取地址的函数的正确全长地址。
当我回到我的主程序时,它看起来像这样:

PVOID address = GetProcAddressR(buffer, length);


地址被截断为32位数。

0x00002023A83EFF30


变成

0xFFFFFFFA83EFF30


我检查了这个的disasemmbly,它看起来像指令

CDQE


正在被调用,这正是我遇到的问题。但是,我不确定上面链接的文件中的哪个位置导致了任何问题。

v9tzhpje

v9tzhpje1#

我只是因为自己的失败而偶然发现了这一点,也许这有助于某些人在某个时候像我一样盲目的人。在我的情况下,我只是忘记了包括实际声明我试图使用的数据类型的头。在下面的例子中,应用程序在VS 2022中构建得很好,但没有报告任何错误或警告。虽然问题会出现在main()中,变量sample被赋值为sample_create()实际返回的64 b指针的32 b值。从技术/编译器的Angular 来看,这对我来说完全没问题,我只是错过了VS的一个警告,即使用了一个未知类型。
参见以下简化示例。
样品h:

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

字符串
sample.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;
}

相关问题