mfc_Key_Hook - 8BitsCoding/RobotMentor GitHub Wiki

ํ‚ค ํ›„ํ‚น์ด๋ž€?

ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ํ”„๋กœ๊ทธ๋žจ (๊ฐ€๋ น ๋ฉ”๋ชจ์žฅ)์—์„œ ์ž…๋ ฅ๋˜๋Š” ํ‚ค๋ฉ”์‹œ์ง€๋ฅผ ๋น„ํ™œ์„ฑํ™”๋œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ

๊ตฌํ˜„์˜ ๋ฐฉ๋ฒ•์€ dll์„ ๋งŒ๋“ค์–ด ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐ›์€ ํ‚ค ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€๋ฅผ ์†ก์‹ ํ•ด์ฃผ๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„!!


dll๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๋ณด์ž.

์ƒˆ ํ”„๋กœ์ ํŠธ -> Windows ๋ฐ์Šคํฌํ†ฑ -> Windows ๋ฐ์Šคํฌํ†ฑ ๋งˆ๋ฒ•์‚ฌ

์ด๋ฏธ์ง€

์ด๋ฏธ์ง€

// dllmain.cpp 
#include "pch.h"

HINSTANCE gh_instance;
HHOOK gh_next_hook;
HWND gh_target_wnd;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    gh_instance = hModule;
    return TRUE;
}

LRESULT CALLBACK KeyboardProc(int a_code, WPARAM wParam, LPARAM lParam)
{
    // ํ›„ํ‚น ์‹œ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
    if(a_code == HC_ACTION) {
        if(gh_target_wnd != NULL) {
            ::PostMessage(gh_target_wnd, 27001, wParam, lParam);
        }
        else UninstallKeyHook()
    }

    return CallNextHookEx(gh_next_hook, a_code, wParam, lParam);
}

extern "C" __declspec(dllexport) void InstallKeyHook()
{
    // ํ›„ํ‚น ์‹œ๋„
    gh_target_wnd = ::FindWindow(NULL, L"TipsSpy");
    gh_next_hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, gh_instance, 0);
}

extern "C" __declspec(dllexport) void UninstallKeyHook()
{
    // ํ›„ํ‚น ํ•ด์ œ
    UnhookWindowsHookEx(gh_next_hook);
}

์ฝ”๋“œ์„ค๋ช…

gh_instance = hModule; : dll์ด Hookingํ•  ํ”„๋กœ๊ทธ๋žจ์— Attatch๋  ๊ฒฝ์šฐ HINSTANCE๋ฅผ ์ „์—ญ์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ์ €์žฅํ•œ ์ด์œ ๋Š” DllMain์ด ๋๋‚˜๋ฉด HMODULE hModule์€ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž„.

HHOOK gh_next_hook; : ๋‹ค์Œ์œผ๋กœ ํ›„ํ‚นํ•  ํ”„๋กœ์„ธ์Šค ์ €์žฅ

HWND gh_target_wnd; : ํ›„ํ‚น ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ค„ ์œˆ๋„์šฐ

SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, gh_instance, 0); : WH_KEYBOARD ํ‚ค๋ณด๋“œ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด์„œ ํ›„ํ‚น์„ ํ•˜๊ณ , ํ›„ํ‚น ์‹œ KeyboardProcํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. gh_instance์—์„œ ํ›„ํ‚น์ง„ํ–‰

extern "C" : ๋ฅผ ๋ถ™์ด๋Š” ์ด์œ ๋Š” C์Šคํƒ€์ผ ์ฝ”๋”ฉ ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์ฐพ๊ธฐ์œ„ํ•จ์ด๋‹ค.

__declspec(dllexport) : dll ์™ธ๋ถ€์—์„œ๋„ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์„ ์–ธ

dll๊นŒ์ง€๋Š” ์™„์„ฑ


ํƒ€๊ฒŸ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋”ฉ

dll์„ ์—ฐ๊ฒฐํ•ด๋ณด์ž.

// Dlg.h
private:
    HINSTANCE mh_hook_dll;
// Dlg.cpp
// OnInitDlg
mh_hook_dll = ::LoadLibraryA("TipsMon.dll");

// void InstallKeyHook()์— ๋Œ€ํ•œ Function Pointer
void (*fp)(void) = (void(*)(void))GetProcAddress(mh_hook_dll, "InstallKeyHook");

if(fp != NULL)  // ์ž˜ ์ƒ์„ฑ์ด ๋˜์—ˆ๋‚˜ ํ™•์ธ
// On27001
CString str;
str.Format(L"%08X %08X", wParam, lParam);
int index = m_event_list.InsertString(-1, str);
m_event_list.SetCurSel(index);
// OnDestroy
void (*fp)(void) = (void(*)(void))GetProcAddress(mh_hook_dll, "UnInstallKeyHook");
if(fp != NULL)  // ์ž˜ ์ƒ์„ฑ์ด ๋˜์—ˆ๋‚˜ ํ™•์ธ

::FreeLibrary(mh_hook_dll);     // Attach๋œ dll์„ Detach

KeyUp, KeyDown ํ™•์ธ

// On27001
CString str;
if(lParam & 0x80000000) {
    str.Format(L"[Key up] %08X(%c) %08X", wParam, lParam);
    // edit box์— ๋ฐ”๋กœ ๊ทธ๋ ค๋ณธ๋‹ค.
    m_show_edit.PostMessage(WM_KEYUP, wParam, lParam);
}
else {
    str.Format(L"[Key down] %08X(%c) %08X", wParam, lParam);
    // edit box์— ๋ฐ”๋กœ ๊ทธ๋ ค๋ณธ๋‹ค.
    m_show_edit.PostMessage(WM_KEYDOWN, wParam, lParam);
}
int index = m_event_list.InsertString(-1, str);
m_event_list.SetCurSel(index);