Моя программа работает на 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_hCurrentProcessBase
BYTE*
к типу, но сначала, я отливают его 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 *
не работает?
* указатель арифметика * – WhozCraig