use*_*275 6 c++ dll 64-bit hook
介绍信息: Windows 7 64位.C++.64位应用程序和DLL.没有MS Detours挂钩.
问题:我一直在努力解决一个可以证明在Windows中挂钩的工作示例的问题.在32位Windows XP是唯一的操作系统的时候,似乎已经编写了大部分内容......我已经克服了理解的64位障碍并成功注入了DLL.这个知识之旅的下一步是挂钩.为了与主题的怀旧情绪保持一致,MS的Detours不支持64位(免费),我当然不会支付10,000美元.所以我在本教程中采用了传统方法.
这个啧啧很棒,但我在理解这个细分时遇到了一些麻烦:
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);
}
Run Code Online (Sandbox Code Playgroud)
特别是,我正在努力使用tempJMP字节和所有memcpy.我有一个记事本的InsertDate()函数的地址,我想劫持,但我不知道在哪里瞄准它...这是新函数的地址吗?或者它不是相对的?Idk,我只是在寻找一些指针.
整个想法是“覆盖”执行 Messagebox 的原始代码:
JuMP <CustomMessageBoxFunction>
RETurn (back to program execution)
Run Code Online (Sandbox Code Playgroud)
所以 ,
首先,他将 shellcode 复制到 JMP 数组:
memcpy(JMP, tempJMP, SIZE);
Run Code Online (Sandbox Code Playgroud)
然后他将原始汇编代码字节从原始地址复制到他的临时存储“oldBytes”,以便他可以在执行他的自定义函数后将其复制回来:
memcpy(oldBytes, pOrigMBAddress, SIZE);
Run Code Online (Sandbox Code Playgroud)
然后,他将之前计算的地址大小复制到 jmp 命令之后的 JMP 数组中:
memcpy(&JMP[1], &JMPSize, 4);
Run Code Online (Sandbox Code Playgroud)
最后他的 JMP[] 数组包含调用他的函数所需的 shellcode,例如
JMP 1234
RET
Run Code Online (Sandbox Code Playgroud)
所以现在他必须将其复制到程序期望找到原始 MessageBox 函数的原始字节上:
memcpy(pOrigMBAddress, JMP, SIZE);
Run Code Online (Sandbox Code Playgroud)
现在回到你的问题,如果你想挂钩 InsertDate() 那么你可以使用 InsertDate 的地址而不是使用 pOrigMBAddress 。
但我不确定这是否适用于 64 位 Windows。