°­ÁÂ¿Í ÆÁ

Àú¼öÁØ Å°º¸µå ÈÄÅ· ¿¹Á¦ ¹× °­Á ³¯Â¥:2022-2-28 3:58:37 Á¶È¸¼ö:183
ÀÛ¼ºÀÚ : daypark
Æ÷ÀÎÆ® : 957
°¡ÀÔÀÏ : 2020-02-14 10:42:05
¹æ¹®È½¼ö : 194
±Û 137°³, ´ñ±Û 25°³
¼Ò°³ : ÀÚ±â¼Ò°³¸¦ ÀÔ·ÂÇϽʽÿÀ.
ÀÛ¼º±Û º¸±â
ÂÊÁö º¸³»±â
½Ã½ºÅÛ Àü¿ªÀûÀΠŰº¸µå ¸Þ½ÃÁö¸¦ °¡·Îä´Â Űº¸µå ÈÄÅ·Àº µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. µÎ ¹æ½ÄÀº ¸Þ½ÃÁö¸¦ ¾ðÁ¦ ²¨³»´ÂÁö°¡ ´Ù¸£¸ç ÀÌ Â÷ÀÌ·Î ÀÎÇØ ¿©·¯°¡Áö Ư¼º°ú Ȱ¿ëó°¡ ´Ù¸£´Ù.

-°í¼öÁØ ÈÅ ÇÁ·Î½ÃÀú´Â ¸Þ½ÃÁö¸¦ ²¨³¾¶§ È£ÃâµÇ´Â ¹Ý¸é Àú¼öÁØ ÈÅ ÇÁ·Î½ÃÀú´Â Űº¸µå ¸Þ½ÃÁö¸¦ ½º·¹µå Å¥¿¡ ºÙÀÏ ¶§ È£ÃâµÈ´Ù. 
- °í¼öÁØÀº Ÿ°ÙÀÌ ²¨³½ ¸Þ½ÃÁö¸¦ µé¿©´Ù ºÁ¾ß ÇϹǷΠŸ°Ù ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡¼­ ½ÇÇàÇØ¾ß ÇÏÁö¸¸ Àú¼öÁØÀº ½Ã½ºÅÛÀÌ ¸Þ½ÃÁö Å¥¿¡ ³ÖÀ» ¸Þ½ÃÁö¸¦ º¸¹Ç·Î ±×·² Çʿ䰡 ¾ø´Ù. DLLÀÌ Å¸°Ù ÇÁ·Î¼¼½º¿¡ ÁÖÀÔµÇÁö ¾ÊÀ¸¸ç ´ë½Å ÄÁÅØ½ºÆ® ½ºÀ§Äª¸¸ Àá½Ã ¹ß»ýÇÑ´Ù.
-°í¼öÁØÀº Áö¿ª ÈÅÀÌ °¡´ÉÇÏÁö¸¸ Àú¼öÁØÀº ¿øÄ¢ÀûÀ¸·Î Àü¿ª ÈŸ¸ °¡´ÉÇÏ´Ù. ´ë½Å Àú¼öÁØÀº DLL·Î ºÐ¸®ÇÏÁö ¾Ê´õ¶óµµ Àü¿ª ÈÄÅ·ÀÌ °¡´ÉÇÑ ÀÌÁ¡ÀÌ ÀÖ´Ù.
-°í¼öÁØÀº keybd_event·Î ¹ß»ý½ÃŲ À̺¥Æ®¿Í Űº¸µå·ÎºÎÅÍ ¹ß»ýÇÑ À̺¥Æ®¸¦ ±¸ºÐÇÒ ¼ö ¾øÁö¸¸ Àú¼öÁØÀº Ç÷¡±×ÀÇ LLKHF_INJECTED ºñÆ®¸¦ Á¡°ËÇÏ¿© ÀÎÀ§ÀûÀÎ ¸Þ½ÃÁöÀÎÁö¸¦ ±¸ºÐÇÒ ¼ö ÀÖ´Ù.
-wParam, lParamÀ¸·Î Àü´ÞµÇ´Â Á¤º¸°¡ ´Ù¸£´Ù. Àú¼öÁØÀº wParamÀ¸·Î ¸Þ½ÃÁöÀÇ Á¾·ù°¡ ¿À°í lParam¿¡´Â °¡»óŰ, ½ºÄµ ÄÚµå, Ç÷¡±×, ½Ã°£, ¿©ºÐ Á¤º¸ µîÀ» ¸â¹ö·Î °¡Áø ±¸Á¶Ã¼°¡ ¿Â´Ù.

µÎ ¹æ¹ý ¸ðµÎ ¸ð´ÏÅ͸µ¸¸ °¡´ÉÇÏ¸ç ¸Þ½ÃÁö ÀÚü¸¦ Á¶ÀÛÇÏ´Â °ÍÀº ¾ÈµÈ´Ù. ±×·¯³ª ¸Þ½ÃÁö¸¦ ¾Æ¿¹ ¸Ô¾î ¹ö¸®°í »õ·Î¿î ¸Þ½ÃÁö¸¦ ¹Ð¾î ³Ö´Â ¹æ½ÄÀ¸·Î ¾î´À Á¤µµ´Â Á¶ÀÛÇÒ ¼ö ÀÖ´Ù. 
°í¼öÁØ ÈÄÅ·Àº ÀÚ·á°¡ ¸¹À¸¹Ç·Î ¿©±â¼­´Â Àú¼öÁØ ÈÄÅ·À» ÁßÁ¡ÀûÀ¸·Î ¾Ë¾Æ º¸ÀÚ. µé¿©´Ù º¸´Â ½ÃÁ¡ÀÌ ´õ ºü¸£°í ¸Þ½ÃÁö¸¦ ¿øÇü ±×´ë·Î º¼ ¼ö ÀÖ´Ù´Â °ÍÀÏ »Ó ¾î·Æ°Å³ª ³­ÇØÇÏÁö´Â ¾Ê´Ù. ´ÙÀ½Àº Àú¼öÁØ ÈÄÅ· Å×½ºÆ® ¿¹Á¦ÀÌ´Ù. 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass = TEXT("KeyHookLL");

int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
    , _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst = hInstance;

    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = WndProc;
    WndClass.lpszClassName = lpszClass;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, (HMENU)NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    hWndMain = hWnd;

    while (GetMessage(&Message, NULL, 0, 0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return (int)Message.wParam;
}

HHOOK hKeyHookLL = NULL;
TCHAR MesName[111];
TCHAR log[256];
TCHAR output[65000];
LRESULT CALLBACK KeyHookProcLL(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0) {
        KBDLLHOOKSTRUCT* kb = (KBDLLHOOKSTRUCT*)lParam;
        if (wParam == WM_KEYDOWN) lstrcpy(MesName, "Down");
        if (wParam == WM_KEYUP) lstrcpy(MesName, "Up");
        if (wParam == WM_SYSKEYDOWN) lstrcpy(MesName, "SysDown");
        if (wParam == WM_SYSKEYUP) lstrcpy(MesName, "SysUp");
        if ((kb->flags & LLKHF_INJECTED) != 0) lstrcat(MesName, "(Injected)");

        wsprintf(log, "%s - vk = %x(%c), scan = %x, flag=%x, time = %d\r\n", 
            MesName, kb->vkCode, kb->vkCode, kb->scanCode, kb->flags, kb->time);
        lstrcat(output, log);

        // ESC¸¦ ´©¸£¸é ¸Þ½ÃÁö¸¦ ¸®¼ÂÇÑ´Ù.
        if (wParam == WM_KEYDOWN && kb->vkCode == VK_ESCAPE) {
            lstrcpy(output, "");
        }
        InvalidateRect(hWndMain, NULL, TRUE);

        // 0ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏÇÏ¿© ƯÁ¤ Ű´Â ÀÔ·ÂÀ» ±ÝÁöÇÑ´Ù. 
        if (kb->vkCode == '1') {
            return 1;
        }

        // ´Ù¸¥ Ű·Î ¹Ù²Ù´Â ±â´ÉÀº ¾ÈµÈ´Ù. 
        if (kb->vkCode == '2') {
            kb->vkCode = '3';
        }

        // Ű ÀÔ·ÂÀ» ±ÝÁöÇÏ°í »õ·Î¿î Ű ÀÔ·ÂÀ» ¹ß»ýÇÒ ¼ö´Â ÀÖ´Ù. 
        if (kb->vkCode == '4') {
            keybd_event('5', 0, wParam == WM_KEYDOWN ? 0: KEYEVENTF_KEYUP, 0);
            return 1;
        }
    }
    return CallNextHookEx(hKeyHookLL, nCode, wParam, lParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT crt;

    switch (iMessage) {
    case WM_CREATE:
        hKeyHookLL = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookProcLL, g_hInst, NULL);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        GetClientRect(hWnd, &crt);
        DrawText(hdc, output, -1, &crt, 0);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        if (hKeyHookLL != NULL) UnhookWindowsHookEx(hKeyHookLL);
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

¼³Ä¡´Â ´Ù¸¥ ÈŰú °°µÇ ÈŠŸÀÔÀ» WH_KEYBOARD_LL·Î ÁöÁ¤ÇÑ´Ù. DLL·Î ¼³Ä¡ÇÒ ÇÊ¿ä ¾øÀ¸¹Ç·Î ÁÖü´Â Ç×»ó ÇöÀç ÀνºÅϽºÀ̸ç Àü¿ª¸¸ °¡´ÉÇϹǷΠ´ë»ó ½º·¹µå´Â ¾ðÁ¦³ª NULLÀÌ´Ù. ÈÅ ÇÁ·Î½ÃÀú´Â ¸Þ½ÃÁö Àü¼ÛÀ» ÅëÇØ È£ÃâµÇ¹Ç·Î ÁÖü´Â ¹Ýµå½Ã ¸Þ½ÃÁö ·çÇÁ°¡ ÀÖ¾î¾ß ÇÑ´Ù. WM_CREATE¿¡¼­ ¼³Ä¡Çϰí WM_DESTROY¿¡¼­ ÇØÁ¦ÇÏ¸é ½ÇÇàÁßÀε¿¾È ¸ðµç Űº¸µå ¸Þ½ÃÁö¸¦ ÈÅ ÇÁ·Î½ÃÀú·Î ¸ÕÀú ¹Þ´Â´Ù. 
ÈÅ ÇÁ·Î½ÃÀú´Â °¢ ŰÀÇ »óŸ¦ °»½ÅÇϱâ Àü¿¡ È£ÃâµÇ¹Ç·Î À̶§´Â GetAsyncKeyState ÇÔ¼ö·Î ŰÀÇ »óŸ¦ Á¤È®È÷ ¾Ë ¼ö ¾ø´Ù. ¸¸¾à Ű »óŰ¡ ÇÊ¿äÇÏ¸é ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¶§¸¶´Ù ŰÀÇ »óŸ¦ ÀÚüÀûÀ¸·Î °ü¸®ÇØ¾ß ÇÑ´Ù. wParamÀ¸·Î ¸Þ½ÃÁöÀÇ Á¾·ù°¡ Àü´ÞµÇ¸ç lParamÀ¸·Î´Â ´ÙÀ½ ±¸Á¶Ã¼¸¦ Àü´ÞÇÑ´Ù. 

typedef struct tagKBDLLHOOKSTRUCT {
  DWORD     vkCode;
  DWORD     scanCode;
  DWORD     flags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

ÀÌ Á¤º¸¸¦ ÀÐ¾î ¾î¶² ۸¦ ´­·¶´ÂÁö ¶Ã´ÂÁö ÆÄ¾ÇÇÑ´Ù. ¸Þ½ÃÁö¸¦ º» ÈÄ 0À» ¸®ÅÏÇÏ¸é ´ÙÀ½ ÈŠüÀÎÀ» °ÅÃÄ Å¸°Ù À©µµ¿ì·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ¿© ¾Æ¹« ÀÏ ¾øÀÌ Ã³¸®µÈ´Ù. ¸Þ½ÃÁö¸¦ ¾ø¾Ö ¹ö¸®·Á¸é 0ÀÌ ¾Æ´Ñ °ª, Åë»ó 1À» ¸®ÅÏÇÏ¿© ´ÙÀ½ üÀÎÀ¸·Î °¡Áö ¾Êµµ·Ï ÇÑ´Ù. 
ÈÅ ÇÁ·Î½ÃÀú´Â Á¦Çѽ𣳻·Î ¸Þ½ÃÁö¸¦ º¸°Å³ª ó¸®ÇØ¾ß ÇÏ¸ç ¸¸¾à ½Ã°£À» ÃʰúÇÏ¸é ¸Þ½ÃÁö´Â ´ÙÀ½ üÀÎÀ¸·Î °­Á¦ Àü´ÞµÈ´Ù. Á¦Çѽð£Àº ·¹Áö½ºÆ®¸®¿¡ ÁöÁ¤µÇ¾î Àִµ¥ µðÆúÆ®°ªÀº 1ÃÊÀÌ´Ù.
¿¹Á¦ ÄÚµå´Â ¸Þ½ÃÁö¸¦ ¹ÞÀº Á÷ÈÄ ·Î±×¸¦ Ãâ·ÂÇÏ¿© ¾î¶² Ű ¸Þ½ÃÁöÀÎÁö º¸¿©ÁØ´Ù. ´Ù¸¥ ÇÁ·Î±×·¥ÀÇ Å° ÀÔ·ÂÀ» ÈÍÈ÷ µé¿©´Ù º¼ ¼ö ÀÖ´Ù. ´ë°³ÀÇ °æ¿ì ´ÙÀ½ üÀÎÀ¸·Î ¸Þ½ÃÁö¸¦ ±×³É º¸³»Áö¸¸ ÇÊ¿äÇÏ´Ù¸é ¸Þ½ÃÁö¸¦ ¾ø¾Ö ¹ö¸®°Å³ª ¹Ù²Ü ¼ö ÀÖ´Ù. esc¸¦ ´©¸£¸é ·Î±×¸¦ ¸®¼ÂÇϴµ¥ Æ÷Ä¿½º¸¦ °¡ÁöÁö ¾Ê¾Æµµ ÀÌ µ¿ÀÛÀÌ °¡´ÉÇÏ´Ù.
1Ű¿¡ ´ëÇØ¼­´Â 1À» ¸®ÅÏÇÏ¿© ¸Þ½ÃÁö¸¦ ¸Ô¾î ¹ö¸°´Ù. ´ÙÀ½ üÀÎÀ¸·Î ¸Þ½ÃÁö¸¦ º¸³»Áö ¾ÊÀ¸¸é ÀÌ Å°´Â »ç¶óÁø´Ù. µû¶ó¼­ ¾î¶² À©µµ¿ìµµ 1Ű¿¡ ´ëÇÑ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ¾ø´Ù. °ÔÀÓÁß¿¡ win۸¦ ±ÝÁöÇÒ ¶§ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¸é µÈ´Ù. 
2۸¦ 3Ű ÀÔ·ÂÀ¸·Î ¹Ù²Ù´Â °ÍÀº ¾ÈµÈ´Ù. vkCode´Â ´­·¯Áø Ű¿¡ ´ëÇÑ Á¤º¸ÀÏ »ÓÀ̸ç ÀÌ °ªÀ» ¹Ù²Û´Ù°í ÇØ¼­ Ÿ°ÙÀÌ ¹Þ´Â ¸Þ½ÃÁö°¡ ´Þ¶óÁöÁö´Â ¾Ê´Â´Ù. Áï ÈÅ ÇÁ·Î½ÃÀú·Î Àü´ÞµÇ´Â ÆÄ¶ó¹ÌÅÍ´Â Àбâ Àü¿ëÀÌ´Ù.
¸Þ½ÃÁö¸¦ Á¤ ¹Ù²Ù°í ½ÍÀ¸¸é ÀÏ´Ü ¸Ô¾î ¹ö¸®°í keybd_eventÇÔ¼ö·Î »õ·Î¿î ŰÀÔ·ÂÀ» »ý¼ºÇÑ´Ù. 4¸¦ ´©¸£¸é 5·Î ¹Ù²ã ¹ö¸°´Ù. »õ·Î ¹ß»ýÇÑ 5 ÀԷµµ ÈÅ ÇÁ·Î½ÃÀú·Î ¿À¸ç ÀÌ ÀÔ·ÂÀ» ´ÙÀ½ üÀÎÀ¸·Î º¸³»¸é ÃÖÁ¾ Ÿ°ÙÀ¸·Î Àü´ÞµÈ´Ù. Űº¸µå·Î Á÷Á¢ ÀÔ·ÂÇÏÁö ¾ÊÀº ¸Þ½ÃÁö¸¦ ±¸ºÐÇØ ³»·Á¸é flagÀÇ LLKHF_INJECTED Ç÷¡±×¸¦ Á¡°ËÇÑ´Ù.



¿¹Á¦¸¦ ½ÇÇàÇØ º¸°í ´Ù¸¥ À©µµ¿ì¿¡¼­ 1, 2, 4 ¸¦ °¢°¢ ´­·¯ º¸¸é ÈÅ ÇÁ·Î½ÃÀú°¡ ¸Þ½ÃÁö¸¦ ¾î¶»°Ô Á¶ÀÛÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ´Ù¸¥ À©µµ¿ì¿¡ ÀԷµǴ Ű¸¦ ¸ðµÎ º¼ ¼ö ÀÖÀ¸¸ç ¾ÆÁÖ Æ¯¼öÇÑ ¸î°¡Áö¸¦ Á¦¿ÜÇϰí´Â ´ëºÎºÐÀÇ º¯Çüµµ °¡´ÉÇÏ´Ù. 
 

¸ñ·Ïº¸±â »èÁ¦ ¼öÁ¤ ½Å°í ½ºÅ©·¦


·Î±×ÀÎÇÏ¼Å¾ß ´ñ±ÛÀ» ´Þ ¼ö ÀÖ½À´Ï´Ù.