简介: Windows 7 64位.C++。64位应用程序和DLL的.没有的挂钩.
问题:--我在获得一个演示在中挂钩的工作示例的问题上遇到了困难。大部分的out似乎都是在32位Windows是唯一的操作系统的时候编写的.从那以后,我克服了理解的64位障碍,成功地注入了一个DLL。我在这个知识之旅的下一个步骤是联系。出于对这个话题的怀旧,微软的Detours不支持64位(免费),我当然不会为任何东西支付1万美元。因此,我在本教程中采用了传统的方法。
这个tut很棒,但是我在理解这个片段时遇到了一点困难:
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()函数的地址,但是我不确定它的目标是什么.这是新功能的地址吗?或者它不是相对的?我只是在找一些指点。
发布于 2012-05-11 08:59:00
Hotpatchable函数从下面的指令mov、edi开始,并在前面加上5个NOP指令(如果我记得正确的话,代码洞穴)。
当热补丁,移动edi,edi被覆盖在代码洞穴的短跳转。代码洞穴也会重新编写,跳转到钩子处理程序(拦截API调用的函数,然后将其转发给真正的API函数)。
发布于 2012-02-21 13:48:59
整个想法是“覆盖”执行Messagebox的原始代码:
JuMP <CustomMessageBoxFunction>
RETurn (back to program execution) 所以,
首先,他将其外壳代码复制到JMP数组中:
memcpy(JMP, tempJMP, SIZE);然后,他将原始汇编代码字节从原始地址复制到临时存储"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位窗口。
https://stackoverflow.com/questions/8993979
复制相似问题