如何使用 DetourAttach() 指向十六进制函数的指针?

Posted

技术标签:

【中文标题】如何使用 DetourAttach() 指向十六进制函数的指针?【英文标题】:How to use DetourAttach() for a pointer to a function in hex? 【发布时间】:2013-06-07 09:55:04 【问题描述】:

我正在尝试使用 detour 库制作教程。

在较早版本的 detour 库 v1.5 中,函数 DetourFunction 用于定义地址,因此 DLL 知道在哪里查找函数。

例如可以这样使用:

         InsertDateTime = (int (__stdcall*)(int))DetourFunction((PBYTE)0x01006F10,       (PBYTE)MyInsertDateTime)

见http://www.moddb.com/groups/ibepex/tutorials/function-hooking

但在较新的版本中,该功能已更改为

     LONG DetourAttach(
        PVOID * ppPointer,
        PVOID pDetour
     );

其中 ppPointer 是指向要附加绕行的目标指针的指针。

现在,由于我知道目标函数的十六进制格式地址 0x01006F10,我想以某种方式将其用作 ppPointer 的参数。我试着写:

               InsertDateTime = (int (__stdcall*)(int))DetourAttach((PVOID*)0x01006F10, MyInsertDateTime);

它编译得很好,但是我的程序并没有像我想象的那样工作。似乎程序永远不会从该地址捕获函数。

所以基本上我的问题是,我是否正确使用了指向十六进制地址的指针,其次,我在使用 DetourAttach() 的方式上是否存在一些基本错误?

【问题讨论】:

我强烈推荐使用 EasyHook...easyhook.codeplex.com 【参考方案1】:

您错误地使用了DetourAttach。在您的情况下,正确的用法是:

int(__stdcall* InsertDateTime)(int) = (int(__stdcall*)(int))(0x01006F10);

LONG errorCode = DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime);
if(!errorCode) 
    //Detour successful

请注意,在存在 ASLR 等技术的情况下;您应该使用GetProcAddress 之类的东西在运行时检索函数的地址,否则您可能会导致损坏或崩溃。

【讨论】:

首先,好答案!所以你写的第一行是指向起始地址为 0x01006F10 的函数的指针。我试图这样做,但是当我使用该地址激活该功能时仍然没有任何反应。我使用 Winject 将 DLL 注入到进程中。现在我尝试在其中注入钩子函数的过程是记事本 32 位。是否有可能使用 ASLR 以使我在 IDA Pro 中找到的函数地址无效?

以上是关于如何使用 DetourAttach() 指向十六进制函数的指针?的主要内容,如果未能解决你的问题,请参考以下文章

二进制八进制十进制十六进制六十四进制如何换算

如何使用 C# 编辑二进制文件的十六进制值

java中如何声明一个十六进制的字符串,或者说,怎么发送一个十六进制数据?

如何使用十六进制字符限制输入掩码范围

如何在bash中创建仅包含十六进制字符而不包含空格的文件的十六进制转储?

如何在打印十六进制值时让Python使用大写字母?