½Ã½ºÅÛ Àü¿ªÀûÀΠŰº¸µå ¸Þ½ÃÁö¸¦ °¡·Îä´Â Űº¸µå ÈÄÅ·Àº µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. µÎ ¹æ½ÄÀº ¸Þ½ÃÁö¸¦ ¾ðÁ¦ ²¨³»´ÂÁö°¡ ´Ù¸£¸ç ÀÌ Â÷ÀÌ·Î ÀÎÇØ ¿©·¯°¡Áö Ư¼º°ú Ȱ¿ëó°¡ ´Ù¸£´Ù.
-°í¼öÁØ ÈÅ ÇÁ·Î½ÃÀú´Â ¸Þ½ÃÁö¸¦ ²¨³¾¶§ È£ÃâµÇ´Â ¹Ý¸é Àú¼öÁØ ÈÅ ÇÁ·Î½ÃÀú´Â Űº¸µå ¸Þ½ÃÁö¸¦ ½º·¹µå Å¥¿¡ ºÙÀÏ ¶§ È£ÃâµÈ´Ù.
- °í¼öÁØÀº Ÿ°ÙÀÌ ²¨³½ ¸Þ½ÃÁö¸¦ µé¿©´Ù ºÁ¾ß ÇϹǷΠŸ°Ù ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡¼ ½ÇÇàÇØ¾ß ÇÏÁö¸¸ Àú¼öÁØÀº ½Ã½ºÅÛÀÌ ¸Þ½ÃÁö Å¥¿¡ ³ÖÀ» ¸Þ½ÃÁö¸¦ º¸¹Ç·Î ±×·² Çʿ䰡 ¾ø´Ù. 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 ¸¦ °¢°¢ ´·¯ º¸¸é ÈÅ ÇÁ·Î½ÃÀú°¡ ¸Þ½ÃÁö¸¦ ¾î¶»°Ô Á¶ÀÛÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ´Ù¸¥ À©µµ¿ì¿¡ ÀԷµǴ Ű¸¦ ¸ðµÎ º¼ ¼ö ÀÖÀ¸¸ç ¾ÆÁÖ Æ¯¼öÇÑ ¸î°¡Áö¸¦ Á¦¿ÜÇϰí´Â ´ëºÎºÐÀÇ º¯Çüµµ °¡´ÉÇÏ´Ù.
|
|