gpt4 book ai didi

c - 可执行文件 IMAGE_OPTIONAL_HEADER ImageBase 为 0

转载 作者:行者123 更新时间:2023-11-30 16:31:10 26 4
gpt4 key购买 nike

我遇到了一个问题,我现在试图解决一段时间,但我找不到任何相关信息,我试图从 PE header 中找到的可选 header 中获取映射的文件图像库,但ImageBase 中的值是 0?

我试图从中获取此值的文件是 64 位可执行文件 (PE64),因此我所做的是使用(CreateFileW 函数)打开该文件,然后使用(CreateFileMappingW 和 MapViewOfFile 函数)映射它,然后我得到带有这些函数的 PE 头文件:

IMAGE_DOS_HEADER* FileUtils_GetFileDOSHeader (void* Arg_FileViewMap) {
if (Arg_FileViewMap != NULL) {
return (IMAGE_DOS_HEADER*) Arg_FileViewMap;
}
return NULL;
}

IMAGE_NT_HEADERS* FileUtils_GetFilePEHeader (void* Arg_FileViewMap) {
if (Arg_FileViewMap != NULL) {
IMAGE_DOS_HEADER* Func_FileDOSHeader = FileUtils_GetFileDOSHeader(Arg_FileViewMap);
if (Func_FileDOSHeader != NULL) {
return (IMAGE_NT_HEADERS*) ((INT64) Func_FileDOSHeader + Func_FileDOSHeader->e_lfanew);
}
}
return NULL;
}

然后我使用这个函数来获取可选 header 或直接执行,结果相同:

IMAGE_OPTIONAL_HEADER* FileUtils_GetFileOptionalHeader (void* Arg_FileViewMap) {
if (Arg_FileViewMap != NULL) {
IMAGE_NT_HEADERS* Arg_FilePEHeader = FileUtils_GetFilePEHeader(Arg_FileViewMap);
if (Arg_FilePEHeader != NULL) {
return (IMAGE_OPTIONAL_HEADER*) &Arg_FilePEHeader->OptionalHeader;
}
}
return NULL;
}

然后我尝试获取值并将其打印出来,这样我就知道它不是 0,如下所示:

wprintf(L"File image base: 0x%015X\n", FileUtils_GetFileOptionalHeader(Func_TargetFileViewMap)->ImageBase);

仅此而已!一旦我将这段代码编译为 64 位并运行它,它会打印出 0 但它应该给我 0x00000010000000,那么这里出了什么问题呢?该值确实正确打印出来,我多次确认该值确实为 0。

现在需要注意的事项:

  1. 一些可执行文件确实给了我 ImageBase 值,但大多数给我 0,即使这是错误的,例如我打开记事本,它给了我 0,但值应该是 0x00000010000000,并向您展示以下是 CFF Explorer 所看到的屏幕截图:(http://prntscr.com/) <- Click

  2. 看起来,除了 ImageBase 由于某种原因为 0 之外,所有其他值都是正确的,如果我打印出 EntryPoint,则该值与 CFF Explorer 告诉我的值确实匹配。

  3. 我为此使用 GCC(来自 MinGW-w64)编译器(C 编程语言)

  4. 我不知道其他 header 中是否有任何其他无效值,只是 ImageBase 让我感到沮丧。

如果您还需要知道打开和映射文件的函数参数是什么,那么它们就是:

HANDLE Func_TargetFile = CreateFileW((wchar_t*) & Func_ConsoleCommand, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE Func_TargetFileMapping = CreateFileMappingW(Func_TargetFile, NULL, PAGE_READWRITE, 0, 0, NULL);
void* Func_TargetFileViewMap = MapViewOfFile(Func_TargetFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

这就是全部,如果您对我的问题感到困惑:为什么 IMAGE_OPTIONAL_HEADER ImageBase 给我的值为 0,即使 header 中的所有其他值似乎与 CFF Explorer 显示的内容匹配? - 谢谢

PS:我会持续检查,如果您需要更多信息,请在下面评论。

最佳答案

我已经解开了这个谜团,它在GetFilePEHeader函数中!现在打印出来的值是:0x000000005F5E100

问题出在转换上,这行代码:

return (IMAGE_NT_HEADERS*) ((char*) (Func_FileDOSHeader) + Func_FileDOSHeader->e_lfanew);

这是固定功能:

IMAGE_NT_HEADERS* FileUtils_GetFilePEHeader (void* Arg_FileViewMap) {
if (Arg_FileViewMap != NULL) {
IMAGE_DOS_HEADER* Func_FileDOSHeader = FileUtils_GetFileDOSHeader(Arg_FileViewMap);
if (Func_FileDOSHeader != NULL) {
return (IMAGE_NT_HEADERS*) ((INT64) Func_FileDOSHeader + Func_FileDOSHeader->e_lfanew);
}
}
return NULL;
}

感谢大家的帮助,这是一个相当愚蠢的问题。我花了三天时间才弄清楚这个问题。

关于c - 可执行文件 IMAGE_OPTIONAL_HEADER ImageBase 为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50747560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com