Моя программа работает на 32-битной Windows, поэтому тип адреса в виртуальной памяти DWORD
, И я хочу подключить API, изменив адрес API в IAT. Итак, сначала я получаю базовый адрес образа целевого процесса. Затем я пытаюсь получить начальный адрес структуры IMAGE_OPTIONAL_HEADER.
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 *
не работает?
Арифметика указателей отличается в зависимости от типа значения, на которое оно указывает.
Если вы приведете указатель к DWORD
, добавив 24 на самом деле добавляет 24*sizeof(DWORD)
на ваш адрес.
При кастинге на BYTE
просто добавляет 24 к адресу (BYTE
1 байт)
Примечание: если вы действительно хотел ваш указатель как DWORD
(здесь не тот случай):
Если вы хотите пропустить 24 байта, просто добавьте 24/sizeof(DWORD)
на ваш DWORD*
указатель.
Поскольку DWORD имеет размер 4, он работает так, как вы хотите (даже если бы он был 2 или 8, он работал бы).
Или вычислить указатель, используя BYTE*
бросить и затем приведение к DWORD*
Других решений пока нет …