如何正确使用 C++ 中的 Detour 库来实现具有已知内存地址的函数的简单挂钩?

Posted

技术标签:

【中文标题】如何正确使用 C++ 中的 Detour 库来实现具有已知内存地址的函数的简单挂钩?【英文标题】:How to use the Detour library in C++ properly for a simple hook of a function with known memory adress? 【发布时间】:2013-06-07 17:03:30 【问题描述】:

我无法使用 detour 来获得我的第一个钩子。我正在使用 Detour 3.0。

我的代码编译得很好,我可以使用 Winject 注入 DLL,但是,我想挂钩的函数似乎没有被挂钩。我正在尝试在 notepad 中挂钩函数 InsertDateTime。http://www.9injector.com/winject-injector/

我使用 IDA Pro Free 以十六进制表示法找到了 InsertDateTime 的地址。

下面的代码中是否存在任何基本错误,或者进程中的内存在每次调用时都不会同时出现?

我的注入 DLL 代码如下所示:

 // dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

#include <windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")
//

int(__stdcall* InsertDateTime)(int) = (int(__stdcall*)(int))(0x0100978A);
int MyInsertDateTime(int x) //Our function

//Messagebox
MessageBox(NULL, TEXT("InsertDateTime Just Got Called"), TEXT("InsertDateTime"), MB_OK);
return InsertDateTime(x); //Return the origional function


BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

switch (ul_reason_for_call) //Decide what to do

case DLL_PROCESS_ATTACH: //On dll attach
    //InsertDateTime = (int (__stdcall*)(int))DetourAttach((PVOID*)0x0100978A, MyInsertDateTime);
    //MessageBox(NULL, TEXT("InsertDateTime Just Got Called"), TEXT("InsertDateTime"), MB_OK);
    DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime);
    //if(!errorCode) 
    //Detour successful

break;
case DLL_THREAD_ATTACH: //On thread attach
        DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime);
break;
case DLL_THREAD_DETACH: //On thread detach
break;
case DLL_PROCESS_DETACH: //on process detach
    DetourDetach((PVOID*)0x0100978A, InsertDateTime);
break;

return TRUE;

此外,代码大多取自使用 Detour 1.5 的旧教程。 参考:http://www.moddb.com/groups/ibepex/tutorials/function-hooking

【问题讨论】:

【参考方案1】:

Detours 使用类似于数据库的事务系统。在调用 Attach 或 Detach 之前,您必须启动一个事务,并且这些更改只会在您提交事务时应用。

DetourTransactionBegin();
DetourAttach(...);
DetourAttach(...);
DetourTransactionCommit();

我认为这是在 2.0 中引入的,这可以解释为什么您的 1.5 教程代码不包含它。

【讨论】:

以上是关于如何正确使用 C++ 中的 Detour 库来实现具有已知内存地址的函数的简单挂钩?的主要内容,如果未能解决你的问题,请参考以下文章

c++ DLNA字幕显示实现与platinium库

如何在 C++ 中正确使用优先级队列

如何正确删除 C++ 中的指针? [复制]

如何正确传递 zmq 上下文(void *)?

如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?

如何仅使用 C++ 中的迭代器正确迭代 3D 向量? [关闭]