介绍信息:Windows 7 64 位。 C++。 64 位应用程序和 DLL。无需 MS 弯路即可 Hook 。
问题:我一直在努力获取一个在 Windows 中演示 Hook 的工作示例。大多数 tuts 似乎是在 32 位 Windows XP 是唯一操作系统的时候写的……从那以后我克服了 64 位的理解障碍并成功地注入(inject)了一个 DLL。我在这次知识之旅中的下一步是 Hook 。 为了与主题的怀旧保持一致,MS 的 Detours 不支持 64 位(免费),我当然不会为任何东西支付 10,000 美元。所以我采用了this tutorial中的常规方法.
这个 tut 很棒,但是我在理解这一部分时遇到了一些困难:
void BeginRedirect(LPVOID newFunction)
{
BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
memcpy(JMP, tempJMP, SIZE);
DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5);
VirtualProtect((LPVOID)pOrigMBAddress, SIZE,
PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(oldBytes, pOrigMBAddress, SIZE);
memcpy(&JMP[1], &JMPSize, 4);
memcpy(pOrigMBAddress, JMP, SIZE);
VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
}
特别是,我正在努力处理 tempJMP 字节和所有正在进行的 memcpy。我有一个记事本的 InsertDate() 函数的地址,我想劫持它,但我不确定将它瞄准哪里……这会是新函数的地址吗?还是不是相对的? Idk,我只是在寻找一些指示。
最佳答案
Hotpatchable 函数以以下指令开头 mov edi,edi 并且前面是 5 NOP 指令(如果我没记错的话代码洞穴)。
热修补时,mov edi,edi 被短跳转到代码洞覆盖。 代码洞穴也被重写为跳转到你的钩子(Hook)处理程序(你拦截 API 调用然后将其转发到真正的 API 函数的函数)。
关于c++ - 少走弯路的API Hooking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993979/