2012-01-24 311 views
5

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

问题:我一直在努力解决在Windows中演示挂钩的工作示例问题。大多数TUTS在那里似乎是在时间,其中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,我只是在寻找一些指针。

回答

1

整体思路是要 “覆盖” 执行消息框的原代码:

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,您可以使用InsertDate的地址。

但我不知道这将与64位Windows的工作。

2

Hotpatchable函数以下面的指令开始mov edi,edi,前面有 5 NOP指令(如果我没有记错,代码洞)。

热修补时,将MOV EDI,EDI被覆盖有短跳转到代码洞穴。 代码洞穴也重新写一个跳转到你的钩子处理程序(你拦截API调用,然后将其转发到真正的API函数的函数)。