可执行文件IMAGE_OPTIONAL_HEADER ImageBase为0

时间:2018-06-07 18:04:03

标签: c 64-bit header-files

我遇到了一个问题,我试图找出一段时间,但我无法找到任何关于它,我试图从PE头中找到的可选标头获取映射文件图像库但是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;
}

然后我使用此函数获取可选标题或直接执行,结果相同:

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;
}

然后我尝试获取价值并打印出来,所以我知道它不是这样的:

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

就是这样!一旦我为64位编译这个代码并运行它,它打印出0但它应该给我0x00000010000000,所以这里有什么问题?该值确实打印正确,我确保该值确实是很多次。

现在需要注意的事项:

  1. 有些可执行文件确实给了我ImageBase值,但是大多数都给了我0,即使这是错误的,例如我打开记事本,这给了我0但值应该是0x00000010000000,并告诉你这是CFF资源管理器看到的屏幕截图:(http://prntscr.com/) <- Click

  2. 似乎所有其他值都是正确的,除了由于某种原因为0的ImageBase,如果我打印出EntryPoint,那么该值与CFF Explorer告诉我的值相符。

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

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

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

    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,即使标题中的所有其他值看起来与CFF Explorer显示的相匹配? - 谢谢

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

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,它是在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;
}

感谢所有人的帮助,这是一个非常愚蠢的问题。我花了3天才弄明白这一点。