c++ - 少走弯路的API Hooking

标签 c++ dll 64-bit hook

介绍信息:Windows 7 64 位。 C++。 64 位应用程序和 DLL。无需 MS 弯路即可 Hook 。

问题:我一直在努力获取一个在 Windows 中演示 Hook 的工作示例。大多数 tuts 似乎是在 32 位 Windows XP 是唯一操作系统的时候写的……从那以后我克服了 64 位的理解障碍并成功地注入(inject)了一个 DLL。我在这次知识之旅中的下一步是 Hook 。 为了与主题的怀旧保持一致,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,我只是在寻找一些指示。

最佳答案

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

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

关于c++ - 少走弯路的API Hooking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993979/

相关文章:

visual-studio - Visual Studio 64 位?

asp.net - 具有非托管依赖项的 64 位托管程序集未在 IIS/ASP.NET MVC 4 中加载

您的计算机缺少 C++ boost 线程

c++ - 如何编写一个输入和输出均为std::variant的函数

c++ - Visual Studio 设置以在运行时删除对 dll 文件的依赖

dll - Windows Vista 中“属性”中的“版本”选项卡的等效项是什么?

c++ - 在 Windows 环境下在 PostgreSQL 9.1 中创建函数

python - 如何让 Python 使用 Assembly

c++ - mavericks/xcode5.0.1 是如何改变编译器和链接器的?

python - 如何隐藏嵌入在 C++ 应用程序中的 Python 代码?