О крючке WH_CBT - PullRequest
       43

О крючке WH_CBT

0 голосов
/ 07 декабря 2018

Я пытаюсь использовать SetWindowsHookEx для установки WH_CBT ловушки на глобальном уровне, чтобы внедрить DLL в другой процесс.Теперь у меня есть inject.exe, ExampleWindow.exe, inject.dll, позвольте мне показать вам код.

1.code кусок 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;
}  

2.code кусокofject.dll

#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 и все идет хорошо, инъекция.DLL была загружена, и сообщение отладки выводится правильно, и PCHUNTER (это инструмент ARK) может обнаружить перехват сообщения WH_CBT в модуле inject.exe.Затем я запускаю ExampleWindow.exe, там также можно вывести отладочное сообщение.

После этого действия я обновляю окна перехвата сообщений в PCHUNTER, сообщение перехвата WH_CBT исчезло из элемента управления и введено.DLL вообще не вводится в ExampleWindow.exe. Это не мой ожидаемый результат.

Я не знаю, как это происходит.Я надеюсь, что кто-то может помочь мне найти причину этой проблемы.

...