C 可执行文件图像\可选\头ImageBase为0
我遇到了一个问题,我正在尝试解决一段时间,但我找不到任何关于它的信息,我正在尝试从PE头中找到的可选头获取映射文件映像库,但映像库中的值为0 我试图从中获取此值的文件是一个64位可执行文件(PE64),因此我要做的是使用(CreateFileW函数)打开该文件,然后使用(CreateFileMappingW和MapViewOfFile函数)对其进行映射,然后使用以下函数获取PE头文件: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
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
现在需要注意的是:
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;
}