2013-09-11 4 views
1

Как правило, люди говорят, что все, что вам нужно сделать, чтобы получить адрес заголовка PE, это sth. как это:Получение виртуального адреса PE-заголовка в памяти

IMAGE_DOS_HEADER* IDH = (IMAGE_DOS_HEADER*)GetModuleHandle(NULL); 

IMAGE_NT_HEADERS * INT = (IMAGE_NT_HEADERS *)((int *)IDH + (int)IDH.e_lfanew); 

Однако через несколько часов думать, почему это не работает для меня, я понял, что дополнительно нужно разделить IDH.e_lfanew на 4. Таким образом, я получаю правильный указатель на IMAGE_NT_HEADER STRUCT только таким образом:

IMAGE_NT_HEADERS * INT = (IMAGE_NT_HEADERS *)((int *)IDH + (int)(IDH.e_lfanew/4)); 

Может ли кто-нибудь объяснить мне, почему мне нужно его разделить? Моя ОС - 64-битная Windows 8. Может быть, моя версия окон является причиной? Во всяком случае, я был бы очень благодарен за любое руководство!

+0

Что такое PE-заголовок? –

+2

То же самое, что и [Загрузка заголовков PE] (http://stackoverflow.com/questions/8782771/loading-pe-headers) –

+0

Я верю, что если вы измените это (int *) на (int), вам не нужно разделить на 4 ... Вероятно, просто проблема с указателем. –

ответ

2

Поскольку вы добавляете IDH.e_lfanew к int *, где каждый элемент имеет длину 4 байта, и я ожидаю, что e_lfanew является байтовое смещение, а не количество int в структуру.

+0

Большое спасибо. Вот почему – Savail

Смежные вопросы