如何在64位应用程序中从反汇编代码中获取对象?

问题描述 投票:0回答:1

我有可以在内存区域中找到字节序列的模式。

0x74, 0x26, 0x48, 0x8B, 0x05, 0, 0, 0, 0, 0x48, 0x8D, 0x0D, 0, 0, 0, 0

其中 0 - 可以用任何字节填充。 效果很好。

基本上这些字节给了我

.text:000000014002AD99 74 26     jz  short loc_14002ADC1

.text:000000014002AD9B 48 8B 05 86 D1 64 01      mov  rax, qword_141677F28

问题是如何从14002AD99地址获取

qword_141677F28

在 32 位应用程序中,我能够执行类似的操作: 000000014002AD9B + 2。然后我得到了我需要的地址,但在 x64 位中它的工作方式有点不同。我没有得到正确的结果,而是得到了完全错误的结果。

在内存中,

qword_14167777F28

之后的地址是正确的。它给了我我想要的东西,但我该怎么办? 我需要解析 asm 代码还是有其他方法来获取

qword_
qword_141677F28


c++ assembly x86-64
1个回答
1
投票
DWORD WINAPI thread(_In_ LPVOID core) { AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); std::vector<BYTE> pattern{ 0x74, 0x26, 0x48, 0x8B, 0x05, 0, 0, 0, 0, 0x48, 0x8D, 0x0D, 0, 0, 0, 0 }; uintptr_t* address = get_address<uintptr_t*>(pattern, "xrEngine.exe"); std::cout << std::hex << address + 5; // wrong result std::cin.get(); FreeLibraryAndExitThread(static_cast<HMODULE>(core), 0); }```

类似这样的:

14002AD99 + 164D186 + 2 + 7 = 141677F28

© www.soinside.com 2019 - 2024. All rights reserved.