可执行文件 IMAGE_OPTIONAL_HEADER ImageBase 为 0
Executable File IMAGE_OPTIONAL_HEADER ImageBase is 0
我遇到了一个问题,我一直在努力解决这个问题,但我找不到任何关于它的信息,我正试图从它的可选 header 找到一个映射文件图像库在 PE header 但 ImageBase 中的值为 0?
我试图从中获取此值的文件是 64 位可执行文件 (PE64),所以我正在做的是使用(CreateFileW 函数)打开文件,然后使用(CreateFileMappingW 和 MapViewOfFile 函数)映射它),然后我得到具有这些功能的 PE Header 文件:
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。
现在注意事项:
有些可执行文件确实给了我 ImageBase 值,但大多数给了我 0,即使那是错误的,例如我打开记事本并给了我 0,但该值应该是 0x00000010000000,并且向您展示这是 CFF Explorer 看到的屏幕截图:(http://prntscr.com/) <- Click
似乎所有其他值都是正确的,除了 ImageBase 由于某种原因为 0,如果我打印出 EntryPoint,那么该值确实与 CFF Explorer 告诉我的相匹配。
为此我正在使用 GCC(来自 MinGW-w64)编译器(C 编程语言)
我不知道其他 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;
}
感谢大家的帮助,这是一个非常愚蠢的问题。我花了 3 天时间才弄明白。
我遇到了一个问题,我一直在努力解决这个问题,但我找不到任何关于它的信息,我正试图从它的可选 header 找到一个映射文件图像库在 PE header 但 ImageBase 中的值为 0?
我试图从中获取此值的文件是 64 位可执行文件 (PE64),所以我正在做的是使用(CreateFileW 函数)打开文件,然后使用(CreateFileMappingW 和 MapViewOfFile 函数)映射它),然后我得到具有这些功能的 PE Header 文件:
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。
现在注意事项:
有些可执行文件确实给了我 ImageBase 值,但大多数给了我 0,即使那是错误的,例如我打开记事本并给了我 0,但该值应该是 0x00000010000000,并且向您展示这是 CFF Explorer 看到的屏幕截图:(http://prntscr.com/) <- Click
似乎所有其他值都是正确的,除了 ImageBase 由于某种原因为 0,如果我打印出 EntryPoint,那么该值确实与 CFF Explorer 告诉我的相匹配。
为此我正在使用 GCC(来自 MinGW-w64)编译器(C 编程语言)
我不知道其他 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;
}
感谢大家的帮助,这是一个非常愚蠢的问题。我花了 3 天时间才弄明白。