我无法使用绕道工作来获得我的第一个钩子。我正在使用Detour 3.0。
我的代码编译得很好,我可以使用 Winject 注入DLL,但是,我想挂钩的函数似乎并没有被挂钩。我试图在记事本中挂钩函数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
答案 0 :(得分:3)
Detours正在使用类似于数据库的交易系统。在您可以调用Attach或Detach之前,您必须启动一个事务,并且更改仅在您提交事务时适用。
DetourTransactionBegin();
DetourAttach(...);
DetourAttach(...);
DetourTransactionCommit();
我认为这是在2.0中引入的,这可以解释为什么1.5的教程代码不包含它。