关于WH_CBT挂钩

时间:2018-12-07 06:34:28

标签: c++ winapi setwindowshookex

我正在尝试使用SetWindowsHookEx在全局上安装WH_CBT钩子,以将DLL注入其他进程。现在我有了inject.exe,ExampleWindow.exe,inject.dll,让我向您展示代码。

1.inject.exe的代码段

#include <windows.h>

int main()
{
    HHOOK hhook = NULL;
    HMODULE dll = LoadLibrary(_T("D:\\projects\\CppDemon\\Release\\HookDemoDll.dll"));
    HOOKPROC pfn = (HOOKPROC)GetProcAddress(dll, "MyCBTProc");
    if (pfn == NULL)
    {
        printf("can not get MyCBTProc,press any key to exit\n");
        getchar();
        return 0;
    }

    printf("press any key to continue hook\n");
    getchar();
    hhook = SetWindowsHookEx(WH_CBT, pfn, dll, 0);
    if (NULL == hhook)
    {
        printf("%d\n", GetLastError());
    }
    printf("press any key to unhook\n");
    getchar();
    UnhookWindowsHookEx(hhook);
    return 0;
}  

inject.dll的2.code段

#ifdef __cplusplus
extern "C"
{
#endif
    extern "C" __declspec(dllexport) LRESULT MyCBTProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam);
#ifdef __cplusplus
}
#endif

LRESULT MyCBTProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    DWORD pid = 0;
    TCHAR buffer[128] = { 0 };
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
        pid = GetCurrentProcessId();
        _stprintf_s(buffer, 128, _T("[+] PID = %d"), pid);
        OutputDebugString(buffer);
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

ExampleWindow.exe是创建命名窗口时进行注入的测试用例。

当我运行inject.exe时,一切顺利,inject.dll已加载,调试消息输出正确,PCHUNTER(这是一个ARK工具)可以检测到模块inject中的WH_CBT消息钩子。可执行程序。然后,我运行ExampleWindow.exe,那里也可以输出调试消息。

此操作之后,我刷新了PCHUNTER中的消息挂钩窗口,WH_CBT挂钩消息已从控件中消失,并且inject.dll根本没有注入到ExampleWindow.exe中。这不是我期望的结果。

我不知道这是怎么发生的。我希望有人可以帮助我找到造成此问题的原因。

0 个答案:

没有答案