DetourAttach成功但没有挂钩的功能:(

时间:2015-02-06 12:46:39

标签: dll hook inject detours

早上好!

我最近阅读了有关挂钩功能的文章非常有趣,我已经按照一两个教程但它似乎永远不会工作,我使用Detoured,这里是完整的代码,在我看来完全正常:(

#include <stdio.h>
#include <windows.h>

#include "stdafx.h"
#include "detours.h"

#pragma comment(lib, "detours.lib")

int(__stdcall* realFunc)(int) = (int(__stdcall*)(int))(0x004157B0);

void hookedFunc(int num)
{
    printf("Test : %d\n", num + 100);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DetourAttach((PVOID*)(&realFunc), (PVOID)hookedFunc);
        break;
    case DLL_THREAD_ATTACH:
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach((PVOID*)(&realFunc), (PVOID)hookedFunc);
        DetourTransactionCommit();
        hookedFunc(100);
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        DetourDetach((PVOID*)0x004157B0, hookedFunc);
        break;
    }
    return TRUE;
}

当使用RemoteDLL和一个简单的控制台应用程序作为虚拟来挂钩函数时,所有步骤都成功完成(以管理员身份运行),我要挂钩的函数的内存地址匹配,但是代码行“printf(”测试:%d \ n“,num + 100);”未执行,结果不会出现在屏幕上......

如果有人知道发生了什么,我会很高兴听到它!

提前致谢!

1 个答案:

答案 0 :(得分:0)

首先,hookedFunc必须具有相同的签名:int __stdcall hookedFunc(int x)。

我想你的代码会产生以下影响:每次有人在地址0x004157B0调用函数时都会调用hookedFunc。这是你期望的吗?

要进行测试,请拨打此地址。让我稍微改变一下代码以澄清:

extern int __stdcall FunctionIWantToHook(int);
int(__stdcall* realFunc)(int) = FunctionIWantToHook;

...
DetourAttach((PVOID*)(&realFunc), (PVOID)hookedFunc);
FunctionIWantToHook(100); // hookedFunc will be called here