简介信息: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,我只是在寻找一些指示。
答案 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位窗口。