Keyboard Hooking under Win32

±è¿µ´ë´Ô Ȩ¿¡¼­ °¡Á®¿È (cozy@hanmail.net)
°Å±â¼­ ¿ø·¡ Ãâó¸¦ ¹àÈ÷Áö ¾Ê¾ÒÀ¸¹Ç·Î ¿øÃâó¿¡ ´ëÇØ¼­´Â ¸ð¸§
±èÅÂÈÆ ¹ø¿ª

´ÙÀ½ ¿¹Á¦´Â Win32¿¡¼­ System wide windows hook(¿ªÀÚÁÖ:ÇϳªÀÇ Application¿¡ ±¹ÇÑ µÇÁö ¾Ê°í ½Ã½ºÅÛ »óÀÇ ¸ðµç ÇÁ·Î¼¼½º¿¡ ¿µÇâÀ» ¹Ìħ)À» ¸¸µé¾î ³»´Â °ÍÀ» º¸¿©ÁØ´Ù. ÀÌ ¿¹Á¦´Â system hook dll°ú example application ¸ðµÎ Á¦°øÇÑ´Ù. (¿ªÀÚÁÖ:System wide windows hookÀ» ÀÛ¼ºÇϱâ À§Çؼ­´Â Hook Callback ÇÔ¼ö°¡ DLL¿¡ µé¾î ÀÖ¾î¾ß ÇÑ´Ù) ¶ÇÇÑ ¿ì¸®°¡ ¸¸µé¾î ³¾ Hook ÇÔ¼ö´Â Áøº¸µÈ ÄÚµù ±â¼ú, Áï, memory mapped filesÀ» »ç¿ëÇØ¼­ ÇÁ·Î¼¼½º °æ°è¸¦ ³Ñ³ªµå´Â Àü¿ª ¸Þ¸ð¸® °øÀ¯Çϱâ, Key Hook ÇÔ¼ö¿¡¼­ ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŲ ApplicationÀ¸·Î ¸Þ½ÃÁö µ¹·Á º¸³»±â, ±×¸®°í DLLÀ» ½ÇÇàÁß¿¡ µ¿ÀûÀ¸·Î LoadingÇϱ⠰°Àº °ÍÀ» º¸¿©ÁØ´Ù.

¿ì¸®°¡ ¸¸µé¾î³¾ ÀÌ Å°º¸µå ÈÅ ¿¹Á¦´Â »ç¿ëÀÚ°¡ Űº¸µå¸¦ ÅëÇØ ³Ö´Â Keystroke ¼ö¸¦ ¸Å°Ü¼­ À¯ÁöÇÑ´Ù. ³ª¾Æ°¡¼­ ¿ì¸®´Â Enter Key¸¦ Trap(»ç·ÎÀâ±â)Çϰí, Enter Key¸¦ ´©¸¥ °¢ ½ÃÁ¡¿¡ Űº¸µå ÈÅÀ» ½ÃÀÛÇÑ ApplicationÀ¸·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ´Â °ÍÀ» º¸¿© ÁÙ °ÍÀÌ´Ù. ±×¸®°í³ª¼­ ¿ì¸®´Â ÇöÀç ApplicationÀ» ÅëÇØ ۸¦ ÀÓ´ëÇÏÁö ¾Ê°í, ¿ÞÂÊ È­»ìÇ¥ ۸¦ TrapÇÏ´Â °ÍÀ» º¸¿©ÁÙ °ÍÀÌ´Ù. ±×º¸´Ù´Â ¿ì¸®´Â ¿À¸¥ÂÊ È­»ìǥŰ·Î ±×°ÍÀ» ´ëüÇÒ °ÍÀÌ´Ù. (³ëÆ®: ÀǽÉÀÌ ÀûÀº »ç¿ëÀÚ¿¡°Ô´Â ¸¹Àº È¥µ¿À» ¾ß±âÇÒ°ÍÀÌ´Ù.)

À©µµ¿ì ½Ã½ºÅÛ¿¡ ÈÅÀ» ´õÇÏ´Â °ÍÀº SetWindowsHookEx()¶ó´Â Windows API¸¦ È£ÃâÇÏ´Â °Í°ú ´ç½ÅÀÌ ¼³Ä¡ÇÏ´Â ÈÅ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ´ç½ÅÀÌ ¼³Ä¡Çϱ⸦ ¿øÇϴ ŸÀÔ¿¡ Àü´ÞÇÏ´Â °ÍÀ» Æ÷ÇÔÇÑ´Ù. System wide hook functionsÀº, ½Ã½ºÅÛ »óÀÇ °¢ ÇÁ·Î¼¼½º¿¡ mapping µÇ¾îÁ®¾ß(¿ªÀÚÁÖ:°¡»ó ÁÖ¼Ò¿Í ¿¬°üµÇ¾î ÀÖÀ½) ÇϹǷÎ, dynamic link library¿¡ ¼ÓÇØ¾ß ÇÔÀÌ ¿ä±¸µÇ¾îÁø´Ù. SetWindowsHookEx() ÇÔ¼ö´Â ´ç½ÅÀÇ ÈÅ ÇÔ¼ö¸¦, ´ç½ÅÀÌ ¼³Ä¡ÇÑ ÈÅÀÇ ÇÚµé(¶Ç´Â ID)À» ¹ÝȯÇÏ´Â, Windows "hook chain"¿¡ ´õÇÑ´Ù. ´ç½ÅÀº ÀÌ ÇÚµéÀ» À©µµ¿ì¿¡ ÀÖ´Â ´ç½ÅÀÇ ÈÅÀ» È®ÀÎÇϰųª Űº¸µå Æ®·¦ÇÎÀÌ ³¡³µÀ»¶§ ´ç½ÅÀÇ ÈÅÀ» Á¦°ÅÇϴµ¥ »ç¿ëÇÒ °ÍÀÌ´Ù.

À©µµ¿ìÁî "hook chain"Àº À©µµ¿ì°¡ ÀÌ¹Ì ¼³Ä¡µÈ ¸ðµç ÈŵéÀÇ trackÀ» À¯ÁöÇϴµ¥ »ç¿ëÇÏ´Â ¿¬°á ¸®½ºÆ®ÀÌ´Ù. ÀÓÀÇ·Î ÁÖ¾îÁø ½Ã°£¿¡ ¼³Ä¡µÇ¾îÁö´Â ´ÙÁß(multiple) ÈÅÀÌ Çã¶ôµÈ´Ù. °¡²û À©µµ¿ìÁî´Â ´ç½ÅÀÇ ÈÅ ÇÔ¼ö¿¡°Ô ¸ðµç ÈÅ¿¡°Ô ÀÛµ¿ÇÒ ±âȸ¸¦ Çã¶ôÇÏ´Â ±× üÀγ»¿¡ ÀÖ´Â ´ÙÀ½ ÈÅÀ» È£ÃâÇϱâÀ§ÇØ ¹°À» °ÍÀÌ´Ù. ¿ì¸®°¡ üÀλóÀÇ ´ÙÀ½ ÈÅÀ» È£ÃâÇÒ¶§ ¿ì¸®´Â ¿ì¸®ÀÇ ÈÅ ÇÔ¼ö ÇÚµéÀ» ´ÙÀ½ ÈÅÀ¸·Î Àü´ÞÇÔ¿¡ ÀÇÇØ ¿ì¸® ÀÚ½ÅÀ» È®ÀÎÇÏ´Â °ÍÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù.

À©µµ¿ìÁî ÈÅÀ» ¸¸µå´Â °ÍÀº win32 ÇÏ¿¡¼­ Ưº°ÇÑ ´Ù·ëÀÌ ÇÊ¿äÇÏ´Ù. DLLÀÌ keystrokes¸¦ ¹Þ´Â ¸ðµç ApplicationÀÇ ÇÁ·Î¼¼½º °ø°£À¸·Î mappingµÇ¾î¾ßÇϱ⠶§¹®ÀÌ´Ù. À̰ÍÀº À̽´°¡ ¾Æ´Ï´Ù. ±×·¯³ª keyhook procedure ³»ºÎ¿¡¼­ ¿î¿µµÉ¶§, Àü¿ªº¯¼ö(´ç½ÅÀÇ ÈÅ ÇÚµé °°Àº °Í)´Â ±× DLLÀÌ ´Ù¸¥ ÇÁ·Î¼¼½º °ø°£À¸·Î mappingµÇ¾î ÀÖÀ»µ¿¾È º¸Á¸µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. À©16¿¡¼­, À̰ÍÀº ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ µÇÁö´Â ¾Ê´Â´Ù. DLLµéÀº ¸ðµç ÇÁ·Î¼¼½º mapping¿¡ °øÀ¯µÈ ´ÜÀÏ Data segment¸¦ °¡Áö°í Àֱ⶧¹®ÀÌ´Ù. À©32¿¡¼­´Â, DLLÀÇ °¢ mappingÀº ¼ÒÀ¯±ÇÀ» °¡Áø Data segment¸¦ ¹Þ´Â´Ù. À̰ÍÀº ±×°ÍÀÌ keyboard hookÀ» ´ã°í ÀÖ´Â DLLÀÌ keystroke¸¦ ¹Þ´Â °¢ ÇÁ·Î¼¼½º¿¡ mappingµÇ¾î ÀÖÀ½À» ÀǹÌÇÑ´Ù. ±×°ÍÀº »õ·Î¿î Data segment¿Í ±×°Í°ú ÇÔ²² ÃʱâÈ­ µÇÁö ¾ÊÀº »õ º¯¼ö¸¦ ¸¦ ¹Þ´Â´Ù. À̰ÍÀÌ ¹®Á¦ÀÌ´Ù. Àü¿ª º¯¼ö(´ç½ÅÀÇ ÈÅ Çڵ鰰Àº °Í)´Â process mappingµé »çÀÌ¿¡¼­ º¸Á¸µÇ¾î¾ß¸¸ ÇÑ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ¿ì¸®´Â system paging file·ÎºÎÅÍ map variableµéÀ» ±â¾ïÇϱâ À§ÇÑ Win32ÀÇ ´É·ÂÀÇ À¯¸®ÇÑ Á¡À» °¡Áú °ÍÀÌ´Ù.

°¢ ½ÃÁ¡¿¡ ¿ì¸®ÀÇ DLLÀº ÇÑ ÇÁ·Î¼¼½º¿¡ mappingµÉ °ÍÀÌ´Ù. ¿ì¸®ÀÇ DLL¾È¿¡ ÀÖ´Â DllMain() ÇÔ¼ö´Â È£Ãâ¿¡ ´ëÇÑ ÀÌÀ¯´Â Áö½ÃÇÏ´Â ÆÄ¶ó¹ÌÅÍ Flag°ú ÇÔ²² À©µµ¿ì¿¡ ÀÇÇØ È£ÃâµÉ °ÍÀÌ´Ù. ¿ì¸®°¡ DLL_PROCESS_ATTACH flag(´Ù¸¥ ÇÁ·Î¼¼½º·Î mappingµÈ °ÍÀ» ¾ò°í ÀÖ´Â ³ªÀÇ DLLÀ» Áö½ÃÇÑ´Ù)¸¦ ¹Þ¾ÒÀ»¶§, ¿ì¸®´Â system paging fileÀ» mappingÇÏ´Â ÆÄÀÏÀ» ¸¸µé °ÍÀ̰í, ¿ì¸®ÀÇ ¸Þ¸ð¸®¿¡ mappingµÈ º¯¼öµé¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾òÀ» °ÍÀÌ´Ù. ¿ì¸®°¡ DLL_PROCESS_DETACH flag(ÇÁ·Î¼¼½º·ÎºÎÅÍ un-mappingµÇ´Â °ÍÀ» ¾ò°í ÀÖ´Â ³ªÀÇ DLLÀ» Áö½ÃÇÑ´Ù.)¸¦ ¹Þ¾ÒÀ»¶§, ¿ì¸®´Â system paging fileÀ» mappingÇÑ ¿ì¸®ÀÇ ÆÄÀÏÀ» ÇØÁ¦ÇÒ °ÍÀÌ´Ù. ¿ì¸®°¡ Æ®·¢¿¡ À¯ÁöÇϱ⸦ ÇÊ¿ä·Î ÇÏ´Â(±×¸®°í keyboard hookÀ» LoadÇÑ Application°ú DLL ¸ðµÎ·ÎºÎÅÍ Á¢±ÙÇÒ ¼ö ÀÖ´Â) ±× º¯¼öµéÀº THookRecÀ» È£ÃâÇÑ ±â·Ï ±¸Á¶Ã¼¿¡ ÇÒ´çµÉ °ÍÀÌ´Ù. THookRec ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°´Ù.

TheHookHandle : ¿ø¹® ÂüÁ¶
TheAppWinHandle : ¿ø¹® ÂüÁ¶
TheCtrlWinHandle : ¿ø¹® ÂüÁ¶
TheKeyCount : ¿ø¹® ÂüÁ¶

DLLÀº ´ÙÀ½ ÇÔ¼öµéÀ» ´ã°í ÀÖ´Ù. - ³»¿ëÀº ¿ø¹® ÂüÁ¶

MapFileMemory
UnMapFileMemory
GetHookRecPointer
KeyBoardProc
StartKeyBoardHook
StopKeyBoardHook
DllEntryPoint

Delphi Hook DLL ¿¹Á¦:
¿ø¹® ÂüÁ¶

Application notes:

¿ì¸®°¡ ¸¸µé¾î ³½ Å×½ºÆ® ApplicationÀº keyboard hookÀ» ´ã°í ÀÖ´Â DLLÀ» LoadingÇÏ´Â °Í°ú ¼³Ä¡ÇÏ´Â °Í, ÃÑ keystroke ¼ö¿Í (½Ç½Ã°£¿¡) enter key»ç ¸î¹ø ´­·¯Á³´Â°¡¸¦ º¸¿©(Display)ÁÖ´Â °Í ±×¸®°í keyboard hook°ú DLLÀ» uninstallÇÏ´Â °ÍÀ» º¸¿©(demonstrates)ÁØ´Ù.

application code´Â µÎ°³ÀÇ label°ú ¹öư, timer component¸¦ °¡Áø FormÀ» Á¤ÀÇÇϹǷμ­ ½ÃÀÛÇÑ´Ù. Çѹø ¿ì¸®´Â ¿ì¸®ÀÇ hook ÇѼö¸¦ ¼³Ä¡ÇÑ´Ù. ¿ì¸®´Â timer¸¦ ½ÃÀÛÇÒ °ÍÀÌ´Ù. ±×¸®°í every timer event¿¡ ±â¹ÝÇØ¼­ ¿ì¸®´Â label1¿¡¼­ ÃÑ keystroke ¼ö(HookÀÌ ¼³Á¤µÈ ÀÌÈÄ »ç¿ëÀÚ¿¡ ÀÇÇØ µé¾î¿Â)¸¦ º¸¿© ÁÙ °ÍÀÌ´Ù. ¶ÇÇÑ ±× ÈÅÀº ¹öưÀÇ OnKeyDown event¸¦ Enter Key°¡ ´­·¯Áø ½ÃÁ¡¿¡¼­ Á¡È­½Ãų °ÍÀÌ´Ù. ±×¸®°í ±×°ÍÀº ¿ì¸®¿¡°Ô Enter Key°¡ ¸î¹ø ´­·¯Á³´Â°¡¸¦ label2ÀÇ captiom¿¡ º¸¿©ÁÙ ¼ö ÀÖ´Â ±âȸ¸¦ ÁØ´Ù.

FormÀÌ Á¤ÀǵÈÈÄ, ¿ì¸®´Â hook DLL¿¡¼­ Á¤ÀÇµÈ ¹Ù¿Í °°Àº ¹æ½ÄÀ¸·Î THookRec ±¸Á¶Ã¼¸¦ Á¤ÀÇÇÑ´Ù. ¿ì¸®°¡ »ç¿ëÇÒ °ÍÀÎ ´Ù¸¥ º¯¼öµéÀº ´ÙÀ½À» Æ÷ÇÔÇÑ´Ù. hook sllÀ» LoadingÇϱâ À§ÇØ »ç¿ëµÇ´Â handle º¯¼ö, GetHookRecPointer(), StartKeyBoardHook(), and StopKeyBoardHook()¸¦ È£ÃâÇϴµ¥ »ç¿ëÇϱâÀ§ÇÑ ¼¼°³ÀÇ ÇÔ¼ö Æ÷ÀÎÅÍ º¯¼ö. ¸¶Áö¸·À¸·Î ¿ì¸®´Â ±× memory mapped º¯¼ö¿¡ Á¢±ÙÇϴµ¥ »ç¿ëÇÏ´Â THookRec ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ, enter key°¡ ¸î¹ø ´­·¯Á³´Â°¡¿¡ ´ëÇÑ Æ®·¢À» À¯ÁöÇÏ´Â º¯¼ö, DLL LoadingÀÇ ¼º°øÀ» Áö½ÃÇϴµ¥ »ç¿ëÇÏ´Â º¯¼ö, ±× ÇÔ¼öµéÀ» ¾ò´Âµ¥ »ç¿ëÇÏ´Â º¯¼ö ±×¸®°í ±× hookÀ» ¼³Á¤Çϴµ¥ »ç¿ëÇÏ´Â º¯¼ö¸¦ Á¤ÀÇÇÑ´Ù.

Application logicÀº ´ÙÀ½Ã³·³ ÇàÇØÁø´Ù.
¿ø¹® ÂüÁ¶