Исполняемый файл IMAGE_OPTIONAL_HEADER ImageBase равен 0 - PullRequest
0 голосов
/ 07 июня 2018

Я столкнулся с проблемой, которую я пытаюсь выяснить некоторое время, но не могу ничего найти по этому поводу, я пытаюсь получить базу изображений сопоставленного файла из его необязательного заголовка, найденного в заголовке 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;
}

Затем я пытаюсь получить значение и распечатать его, чтобы знать, что его значение не равно 0:

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

Вот и все!После того, как я скомпилировал этот код для 64-битной системы и запустил его, он выводит 0, но он должен дать мне 0x00000010000000, так что здесь не так?Значение выводится правильно, я убедился, что это значение действительно много раз.

Теперь стоит отметить:

  1. Некоторые исполняемые файлы действительно дают мнеЗначение ImageBase, но большинство из них дают мне 0, хотя это неправильно, например, я открываю блокнот, и это дает мне 0, но значение должно быть 0x00000010000000, и чтобы показать вам, что это скриншот того, что видит CFF Explorer: (http://prntscr.com/) <- Нажмите </a>

  2. Похоже, что все остальные значения верны, кроме ImageBase, который по какой-то причине равен 0, если я распечатываю EntryPoint, тогда значениесоответствует тому, что говорит мне CFF Explorer.

  3. Я использую компилятор GCC (из MinGW-w64) (язык программирования C) для этого

  4. Я не знаю каких-либо других недопустимых значений в других заголовках, меня просто расстраивает 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, хотя все другие значения взаголовок, кажется, соответствует тому, что мне показывает CFF Explorer?- Спасибо

PS: Я буду проверять последовательно, если вам нужна дополнительная информация, то прокомментируйте ниже.

1 Ответ

0 голосов
/ 07 июня 2018

Я решил загадку, это было в функции 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 дня, чтобы понять это.

...