首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可执行文件IMAGE_OPTIONAL_HEADER ImageBase为0

可执行文件IMAGE_OPTIONAL_HEADER ImageBase为0
EN

Stack Overflow用户
提问于 2018-06-08 02:04:03
回答 1查看 295关注 0票数 0

我遇到了一个问题,我一直在试图解决这个问题,但我找不到任何关于它的东西,我试图从PE标头中找到的可选标头中获取映射的文件映像库,但ImageBase中的值是0?

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

代码语言:javascript
运行
复制
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;
}

然后我使用这个函数来获取可选的头文件,或者直接获取,同样的结果:

代码语言:javascript
运行
复制
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,如下所示:

代码语言:javascript
运行
复制
wprintf(L"File image base: 0x%015X\n", FileUtils_GetFileOptionalHeader(Func_TargetFileViewMap)->ImageBase);

这就是全部!一旦我编译这段64位的代码并运行它,它会输出0,但它应该会给我0x00000010000000,那么这里有什么问题呢?这个值是正确打印出来的,我多次确保这个值确实是0。

现在要注意的是:

  1. 一些可执行文件给了我CFF值,但大多数都是0,尽管这是错误的,例如,我打开记事本,结果是0,但值应该是0x00000010000000,为了向你展示,这是ImageBase资源管理器看到的截图:(http://prntscr.com/) <- Click
  2. ,似乎所有其他值都是正确的,除了ImageBase,出于某种原因,它是0,如果我打印出EntryPoint,则该值确实与CFF Explorer告诉我的内容相匹配。
  3. 我使用的是用于此
  4. 的GCC (来自MinGW-w64)编译器(C编程语言)。我不知道其他标头中有任何其他无效值,只是ImageBase让我感到沮丧。

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

代码语言:javascript
运行
复制
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显示的值相匹配?

附言:我将检查一致,如果你需要更多的信息,然后在下面评论。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50747560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档