我正在使用一个用于反射 DLL 加载的库。这是我遇到问题的文件:
https://github.com/stephenfewer/ReflectiveDLLInjection/blob/master/inject/src/GetProcAddressR.c
最后一行:
return fpResult;
它包含我试图获取地址的函数的正确全长地址。
当我回到主程序时,如下所示:
PVOID address = GetProcAddressR(buffer, length);
地址被截断为 32 位数字。
0x00002023A83EFF30
变成
0xFFFFFFFA83EFF30
我检查了这个的拆解,它看起来像说明
CDQE
正在打电话,这正是我遇到的问题。但是,我不确定上面链接的文件中的哪个位置导致了这些问题。
我只是因为自己的失败而偶然发现了这一点,也许这可以帮助那些像我一样在某些时候突然措手不及的人。 就我而言,我只是忘记包含实际声明我尝试使用的数据类型的标头。 在下面的示例中,应用程序在 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;
}