C++ 无迂回的API挂钩
简介信息:Windows7 64位。C++。64位应用程序和DLL。不走弯路就上钩 问题:我一直在努力获取一个演示如何在Windows中挂钩的工作示例。大多数的图坦卡门似乎都是在32位WindowsXP是唯一的操作系统的时候写的。。。此后,我克服了64位的理解障碍,成功地注入了DLL。我在知识之旅中的下一步是钩住。 为了保持这个话题的怀旧感,MS's Detours不支持64位(免费),我当然不会为任何东西支付10000美元。因此,我在研究中采用了传统的方法 这张图坦卡蒙太棒了,但我在理解这一部分时有点困难:C++ 无迂回的API挂钩,c++,dll,64-bit,hook,C++,Dll,64 Bit,Hook,简介信息:Windows7 64位。C++。64位应用程序和DLL。不走弯路就上钩 问题:我一直在努力获取一个演示如何在Windows中挂钩的工作示例。大多数的图坦卡门似乎都是在32位WindowsXP是唯一的操作系统的时候写的。。。此后,我克服了64位的理解障碍,成功地注入了DLL。我在知识之旅中的下一步是钩住。 为了保持这个话题的怀旧感,MS's Detours不支持64位(免费),我当然不会为任何东西支付10000美元。因此,我在研究中采用了传统的方法 这张图坦卡蒙太棒了,但我在理解这一部
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。我有一个Notepad的InsertDate()函数的地址,我想劫持它,但我不确定它的目标是什么。。。这是新功能的地址吗?或者它不是相对的?Idk,我只是在寻找一些指针。整个想法是“覆盖”执行Messagebox的原始代码,以:
JuMP <CustomMessageBoxFunction>
RETurn (back to program execution)
然后,他将原始汇编代码字节从原始地址复制到其临时存储器“oldBytes”中,以便在执行自定义函数后将其复制回:
memcpy(oldBytes, pOrigMBAddress, SIZE);
然后,他将之前计算的地址大小复制到JMP命令之后的JMP数组中:
memcpy(&JMP[1], &JMPSize, 4);
最后,他的JMP[]数组包含调用其函数所需的外壳代码,例如
JMP 1234
RET
因此,现在他必须将其复制到程序希望找到原始MessageBox函数的原始字节上:
memcpy(pOrigMBAddress, JMP, SIZE);
现在来看你的问题,如果你想钩住InsertDate(),那么你可以使用InsertDate的地址而不是pOrigMBAddress
但我不确定这是否适用于64位windows。可热补丁功能以以下指令mov edi、edi开始,前面是 5条NOP指令(如果我没记错的话,代码是cave) 在热补丁时,mov edi、edi会被短跳转到代码洞覆盖。 代码cave还通过跳转到钩子处理程序(拦截API调用然后将其转发到实际API函数的函数)重新编写
memcpy(pOrigMBAddress, JMP, SIZE);