我尚未找到解决问题的方法。我想知道的是如何在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;

10-08 13:02