我尚未找到解决问题的方法。我想知道的是如何在C ++中做到这一点。
我有一个指向位置mov rcx, qword ptr [0xAddress]
的地址。
然后,我需要找到一种方法,仅使用C ++从该内存位置获取[0xAddress]指针,而无需使用内联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;