【问题标题】:API Hooking without DetoursAPI Hooking 不走弯路
【发布时间】:2012-01-24 20:52:56
【问题描述】:

简介信息: Windows 7 64 位。 C++。 64 位应用程序和 DLL。无需 MS Detours 即可上钩。

问题:我一直在努力解决如何获得一个在 Windows 中演示挂钩的工作示例。那里的大多数 tuts 似乎都是在 32 位 Windows XP 是唯一操作系统的时候编写的……我已经克服了 64 位的理解障碍并成功地注入了一个 DLL。我在这个知识之旅中的下一步就是上钩。 为了与该主题的怀旧保持一致,MS 的 Detours 不支持 64 位(免费),我当然不会为任何东西支付 10,000 美元。所以我在this tutorial中采用了常规方法。

这个 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() 函数的地址,但我不知道该指向哪里……这会是新函数的地址吗?还是不是相对的? Idk,我只是在寻找一些指针。

【问题讨论】:

    标签: c++ dll 64-bit hook


    【解决方案1】:

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

    进行热补丁时,mov edi,edi 会被短跳转到代码洞穴覆盖。 代码洞穴也被重写,跳转到您的钩子处理程序(您拦截 API 调用然后将其转发给真正的 API 函数的函数)。

    【讨论】:

      【解决方案2】:

      整个想法是“覆盖”执行 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() 那么你可以使用 InsertDate 的地址而不是使用 pOrigMBAddress。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-11
        • 2013-09-28
        • 1970-01-01
        • 2012-05-12
        • 2023-03-10
        • 2019-01-27
        • 2018-01-02
        相关资源
        最近更新 更多