C++ 无迂回的API挂钩

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美元。因此,我在研究中采用了传统的方法 这张图坦卡蒙太棒了,但我在理解这一部

简介信息: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);