【发布时间】:2012-01-24 20:52:56
【问题描述】:
简介信息: Windows 7 64 位。 C++。 64 位应用程序和 DLL。无需 MS Detours 即可上钩。
问题:我一直在努力解决如何获得一个在 Windows 中演示挂钩的工作示例。那里的大多数 tuts 似乎都是在 32 位 Windows XP 是唯一操作系统的时候编写的……我已经克服了 64 位的理解障碍并成功地注入了一个 DLL。我在这个知识之旅中的下一步就是上钩。 为了与该主题的怀旧保持一致,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,我只是在寻找一些指针。
【问题讨论】: