указатели — извлечение адреса из & quot; mov rcx, qword ptr [0xAddress] & quot; Инструкция x86 с переполнением стека

Я не нашел решения своей проблемы. Что меня интересует, так это то, как я могу сделать это в C ++.

У меня есть адрес, который указывает на местоположение mov rcx, qword ptr [0xAddress],
Затем мне нужно найти способ получить указатель [0xAddress] из этой области памяти только с C ++, без использования встроенного asm.

//I want something like this, but I don't get it working.
DWORD64 PatchAddress = FindAddressLocation(); //This finds the mov rcx, qword ptr [0xAddress]. location.
uint64_t rcx = *(volatile uint64_t*)PatchAddress;//This is supposed to give me the [0xAddress] address
*(BYTE*)(rcx) = 0;//Then write 0 to the pointer 0xAddress

0

Решение

Обычная кодировка mov rcx, [a] является относительным:

48 8b 0d DD CC BB AA

Смещение со знаком, AABBCCDD, относительно следующей инструкции. Если используется эта кодировка, ваш код C ++ должен быть:

DWORD64 PatchAddress = FindAddressLocation();
uint64_t addr = PatchAddress + 7 + *(int32_t *)(PatchAddress + 3);
*(BYTE*)addr = 0;

Другая кодировка, не относящаяся к RIP, использует байт SIB:

48 8b 0c 25 DD CC BB AA

В этом случае адрес является 32-разрядным подписанным адресом. Код C ++ будет:

DWORD64 PatchAddress = FindAddressLocation();
uint64_t addr = *(int32_t *)(PatchAddress + 4);
*(BYTE*)addr = 0;
4

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

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

По вопросам рекламы [email protected]