Необходимо получить адрес начала PE-заголовка в памяти. Использую данный код:
#define MakePtr(Type, Base, Offset) ((Type)(DWORD(Base) + (DWORD)(Offset)))
HMODULE hModule = GetModuleHandle(NULL);
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS pNTHeaders = MakePtr(PIMAGE_NT_HEADERS,hModule,pDosHeader-
>e_lfanew);
PIMAGE_SECTION_HEADER pSections = IMAGE_FIRST_SECTION(pNTHeaders);
При выводе переменных получаю данные значения:
hModule = 01000000 //дескриптор файла
pDoaHeader = 01000000 //начало Dos заголовка
pDosHeader->e_lfanew = 224
pNTHeaders = 010000E0 // начало PE заголовка
pSections = 010001D8
Вопрос в том почему используется хэндл(дескриптор файла) для нахождения DOS и PE заголовков? Какое он имеет отношение к структуре самого файла? А то получается какому то непонятному числу присваивается тип PIMAGE_DOS_HEADER и выдается по сути за начало файла. Разве DOS заголовок не идет от начала файла т.е. от 00000000?
GetModuleHandle
возвращает хэндл текущего исполнимого модуля (EXE).
В текущих версиях Windows, кажется, его значение равно указателю на базовый адрес модуля. Если формат вашего исполнимого файла начинается с IMAGE_DOS_HEADER
'а, то в начале его образа у вас действительно найдётся PIMAGE_DOS_HEADER
. (DOS-заголовок идёт с начала файла, да — но нулевой адрес файла не означает нулевой адрес модуля: по адресу 0 расположена страница, которая вызывает access violation при обращении!)
Подтверждение: The Old New Thing: Accessing the current module’s HINSTANCE from a static library. (Плюс вам понадобится также «известный» факт, что HINSTANCE
приложения и GetModuleHandle(NULL)
одинаковы.)
Тем не менее, я не нашёл упоминания этих фактов в официальной документации, поэтому я бы рассматривал их как ничем не подкреплённый хак. Стоит ли полагаться на него в вашем коде — решать вам.
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть функция, которая при выводе текста на виджет Textedit (chat_edit), выравнивает его по левому краю через Qt::AlignLeftЯ хочу, чтоб, когда я получу текст,...
Не можете подсказать, какой компилятор для С++ лучше? Изучил основы С++ и хочу попрактиваться