C 可执行文件图像\可选\头ImageBase为0

C 可执行文件图像\可选\头ImageBase为0,c,64-bit,header-files,C,64 Bit,Header Files,我遇到了一个问题,我正在尝试解决一段时间,但我找不到任何关于它的信息,我正在尝试从PE头中找到的可选头获取映射文件映像库,但映像库中的值为0 我试图从中获取此值的文件是一个64位可执行文件(PE64),因此我要做的是使用(CreateFileW函数)打开该文件,然后使用(CreateFileMappingW和MapViewOfFile函数)对其进行映射,然后使用以下函数获取PE头文件: IMAGE_DOS_HEADER* FileUtils_GetFileDOSHeader (void* Arg

我遇到了一个问题,我正在尝试解决一段时间,但我找不到任何关于它的信息,我正在尝试从PE头中找到的可选头获取映射文件映像库,但映像库中的值为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;
}
然后我尝试获取值并将其打印出来,这样我就知道它不是0,就像这样:

wprintf(L"File image base: 0x%015X\n", FileUtils_GetFileOptionalHeader(Func_TargetFileViewMap)->ImageBase);
就这些!一旦我编译了64位的代码并运行它,它就会打印出0,但它应该给我0x00000010000000,那么这里有什么问题?该值打印正确,我多次确保该值确实为0

现在需要注意的是:


  • 一些可执行文件确实给了我ImageBase值,但大多数给了我0,即使这是错误的,例如,我打开记事本,它给了我0,但值应该是0x00000010000000,为了向您展示CFF Explorer看到的屏幕截图:(http://prntscr.com/)我已经解开了迷雾,它在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天时间才弄明白这一点。

    好吧,如果我将ImageBase设置为10000000,那么它会打印出:ImageBase:0x000000005F5E100而不是0,当转换为十进制时,值是正确的。如果我执行If语句检查ImageBase是否为0,它将返回true,以便再次确认。
    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;
    }