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