使用 C++ 从 "mov rcx, qword ptr [0xAddress]" x86 指令中提取地址

Extract the address from a "mov rcx, qword ptr [0xAddress]" x86 instruction with C++

我还没有找到解决问题的办法。我想知道的是我如何在 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] 的常用编码是 rip-relative:

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;