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

标签 c++ pointers assembly x86-64 machine-code

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

关于c++ - 使用 C++ 从 "mov rcx, qword ptr [0xAddress]"x86 指令中提取地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198445/

相关文章:

macos - 将 JonesForth 移植到 macOS v10.15 (Catalina)

c++ - if constexpr std::is_same 在 VS 2022 下

c++ - std::allocator 是否处理 C++17 中的过度对齐类型?

c++ - 使用不同的选项为不同的目标构建相同的文件

c - 如何访问 C 变量以进行内联汇编操作?

c - gdb 不接受用户输入

c++ - 只要应用程序运行就一直打开错误日志是否可以接受?

c - 解码 C 声明并使用它

c++ - 将私有(private)指针数组初始化为 null

c - 返回 Void 指针并将 Hex 转换为 UINT