2016-09-29 8 views
0

Моя программа работает на 32-битной Windows, поэтому тип адреса в виртуальной памяти равен DWORD. И я хочу подключить API, изменив адрес API в IAT. Итак, сначала я получаю базовый адрес изображения целевого процесса. Затем я пытаюсь получить начальный адрес структуры IMAGE_OPTIONAL_HEADER.В чем разница между типом 32-разрядного адреса (BYTE *) и (DWORD *)

IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((BYTE*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24); //variable g_hCurrentProcessBase is the base address of the image of the target process 

Как вы видите, я бросил g_hCurrentProcessBaseBYTE* к типу, но сначала, я отливают его DWORD* типа, например:

IMAGE_OPTIONAL_HEADER32* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((DWORD*)g_hCurrentProcessBase+pDosHeader->e_lfanew+24); 

Но это не сработало, получая неверный адрес от IMAGE_OPTIONAL_HEADER структура. Но значение переменной g_hCurrentProcessBase должно быть DWORD (я запускаю его на 32-битной системе Windows), но приведение этой переменной в DWORD * не получилось, что привело к неправильному адресу. Но кастинг до BYTE* работает, так что в чем разница между ними? Почему литье до DWORD * не работает?

+0

* указатель арифметика * – WhozCraig

ответ

3

Арифметика указателя различается в зависимости от типа значения, на которое оно указывает.

Если вы указали указатель на DWORD, добавление 24 фактически добавит 24*sizeof(DWORD) на ваш адрес.

При литье в BYTE, он просто добавляет 24 к адресу (BYTE 1 байт)

Примечание: Если вы действительно хотел указатель как DWORD (не тот случай):

Если вы хотите пропустить 24 байта, просто добавьте 24/sizeof(DWORD) в указатель DWORD*. Поскольку DWORD имеет размер 4, он работает так, как вам хочется (даже если он был 2 или 8, он будет работать).

Или вычислить указатель, используя BYTE* бросок, и затем приведение к DWORD*

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

  • Нет связанных вопросов^_^