В чем разница между приведением типа 32-битного адреса к (BYTE *) и (DWORD *)

Моя программа работает на 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 * не работает?

0

Решение

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

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

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

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector