没有绕道的API挂钩

时间:2012-01-24 20:52:56

标签: c++ dll 64-bit hook

简介信息:Windows 7 64位。 C ++。 64位应用程序和DLL。没有MS Detours挂钩。

问题:我在获取一个可以证明在Windows中挂钩的工作示例的问题上一直很困难。在32位Windows XP是唯一的操作系统的时候,似乎已经编写了大部分内容......我已经克服了理解的64位障碍并成功注入了DLL。这个知识之旅的下一步是挂钩。     为了与主题的怀旧情绪保持一致,MS的Detours不支持64位(免费),我当然不会支付10,000美元。所以我在this tutorial中追求传统方法。

这个啧啧很棒,但我在理解这个细分时遇到了一些麻烦:

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,我只是在寻找一些指示。

2 个答案:

答案 0 :(得分:2)

Hotpatchable函数以以下指令mov edi,edi开头,并以其开头 5个NOP指令(如果我没记错的话,代码就会破洞)。

当hotpatching时,mov edi,edi被短暂跳转到代码洞穴。 代码洞穴也会重新编写,并跳转到您的钩子处理程序(拦截API调用的函数,然后将其转发给真正的API函数)。

答案 1 :(得分:1)

整个想法是“覆盖”执行Messagebox的原始代码:

JuMP <CustomMessageBoxFunction>
RETurn (back to program execution) 

所以,

首先,他将他的shellcode复制到JMP数组:

 memcpy(JMP, tempJMP, SIZE);

然后他将原始汇编代码字节从原始地址复制到他的临时存储“oldBytes”,以便他可以在执行自定义函数后将其复制回来:

memcpy(oldBytes, pOrigMBAddress, SIZE);

然后他在jmp命令之后立即将他先前计算的地址大小复制到JMP数组:

memcpy(&JMP[1], &JMPSize, 4);

最后,他的JMP []数组包含调用其函数所需的shellcode,例如

JMP 1234
RET

所以现在他必须在程序期望找到原始MessageBox函数的原始字节上复制它:

memcpy(pOrigMBAddress, JMP, SIZE);

现在回答你的问题,如果你想挂钩InsertDate()然后使用pOrigMBAddress而不是使用pOrigMBAddress,你可以使用InsertDate的地址。

但我不确定这适用于64位窗口。