Извлечь адрес из инструкции x86 "mov rcx, qword ptr [0xAddress]" с помощью C ++ - PullRequest
0 голосов
/ 06 мая 2018

Я не нашел решения своей проблемы. Что меня интересует, так это то, как я могу сделать это в 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

1 Ответ

0 голосов
/ 06 мая 2018

Обычная кодировка 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;
...