Áö³ ½Ã°£¿¡ ºØ¾î»§ Àå»ç¸¦ ¿¹·Î µé¸é¼ ¼ºêŬ·¡½Ì¿¡ ´ëÇØ¼ À̾߱⸦ ÇÏ¿´½À´Ï´Ù. À©µµ¿ì ÇÁ·Î½ÃÀú(¼Õ´Ô)¿¡°Ô ¸Þ½ÃÁö(ºØ¾î»§)À» °Ç³×±â Àü¿¡ ¾ó¸¥ ¼ºêŬ·¡½ÌÀ» ÀÌ¿ëÇØ¼ °¡·Îç ¼ö ÀÖ¾ú½À´Ï´Ù. ±×·¸´Ù¸é ¸Þ½ÃÁö¸¦ ±× Àü¿¡ ¹Þ¾Æ¼ ó¸®ÇÒ ¼ö ¾øÀ»±î¿ä? ºØ¾î»§ Àå¼ö°¡ ¼Õ´ÔÀÇ ¿ä±¸¸¦ ¹Ì¸® ¾Ë ¼ö ÀÖ´Ù¸é ºØ¾î»§(¸Þ½ÃÁö)¸¦ ¼Õ´Ô(À©µµ¿ì ÇÁ·Î½ÃÀú)¿¡°Ô °Ç³×±â Àü¿¡ °íÄ¡´Â ±×·± ºÒ»ó»ç¸¦ ÀÏÀ¸Å°Áö ¾Ê¾Æµµ µÉÅÙµ¥¿ä. ±×·± ÀÏÀÌ ÀÚÁÖ ¹ß»ýÇÑ´Ù¸é ºØ¾î»§ Àå¼ö´Â »ç¾÷À» Á¢¾î¾ß µÉÁöµµ ¸ð¸¨´Ï´Ù.
¾Æ·¡ ±×¸²À» º¸°Ú½À´Ï´Ù.
¼ºêŬ·¡½ÌÀº ¸Ç ¿À¸¥ÂÊ¿¡ ÀÖ´Â À©µµ¿ì ÇÁ·Î½ÃÀú·Î °¡±â Àü¿¡ ¸Þ½ÃÁö¸¦ °¡·Îé´Ï´Ù. ±× º¸´Ù ´õ ¾ÕÂÊ¿¡¼ ¸Þ½ÃÁö¸¦ °¡·Î ç ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÀÖ´Ù¸é ¼ºêŬ·¡½Ì º¸´Ù ´õ ¸¹Àº ÀÏÀ» ÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ÇÑ ÇÁ·Î¼¼½º ³»¿¡ À©µµ¿ì°¡ ¿©·¯ °³°¡ ÀÖ´Ù¸é À©µµ¿ì ÇÁ·Î½ÃÀúµµ ¿©·¯ °³°¡ ÀÖ°ÚÁÒ. ¸ðµç ÇÁ·Î½ÃÀú¿¡°Ô ÀϰýÀûÀ¸·Î ó¸®Çϵµ·Ï ÇÏ·Á´Â ¸Þ½ÃÁö°¡ ÀÖ´Ù°í »ý°¢ÇßÀ» ¶§ ÀÏÀÏÀÌ ¼ºêŬ·¡½ÌÀ» °Å´Â °Í º¸´Ù ±× Àü¿¡ ¹Ì¸® ¸Þ½ÃÁö¸¦ ¹Þ¾Æ ó¸®ÇÏ´Â °Ô ÈξÀ È¿À²ÀûÀ̰ÚÁÒ.
Windows¿¡¼´Â ½Ã½ºÅÛ ¸Þ½ÃÁö Å¥¿¡¼ °¢ ¾²·¹µå ¸Þ½ÃÁö Å¥·Î ¸Þ½ÃÁö¸¦ º¸³»±â Àü¿¡ ¸Þ½ÃÁö¸¦ °¡·Îç ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù. ÇÔ¼ö Çϳª¸¸ »ç¿ëÇÏ¸é µÇ´Ï ±²ÀåÈ÷ °£´ÜÇÕ´Ï´Ù. ¹Ù·Î SetWindowsHookEx() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ÁÒ. ÇÔ¼ö À̸§¸¸ ºÁµµ Á÷°üÀûÀ¸·Î ¾Ë ¼ö°¡ ÀÖ½À´Ï´Ù. SetWindowsHookEx() ÇÔ¼ö´Â ¸Þ½ÃÁö¸¦ °¡·Îä´Â(ÈÅÇÏ´Â) ÇÔ¼ö¸¦ ¼³Ä¡ÇÕ´Ï´Ù. ±× ÇÔ¼ö À̸§À» ÈÅ ÇÁ·Î½ÃÀú¶ó°í ºÎ¸¨´Ï´Ù. ¸Þ½ÃÁö°¡ ¹ß»ýÇÑ À©µµ¿ì·Î ¸Þ½ÃÁö¸¦ º¸³»°¡ Àü¿¡ ÈÅ ÇÁ·Î½ÃÀú¿¡¼ ¸Þ½ÃÁö¸¦ ¸ÕÀú ¹Þ¾ÆµéÀÔ´Ï´Ù. ±×¸®°í ³ª¼ ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÕ´Ï´Ù.
1. ÇØ´ç ¸Þ½ÃÁö¿¡ ¸Â´Â ·çƾÀ» ¼öÇàÇÑ´Ù.
2. ¾Æ¹« °Íµµ ¼öÇàÇÏÁö ¾Ê´Â´Ù.
3. ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú·Î ¸Þ½ÃÁö º¸³»°Å³ª º¸³»Áö ¾Ê´Â´Ù.
Áö³ ½Ã°£¿¡ ¹è¿î ¼ºêŬ·¡½Ì°ú ºñ½ÁÇѵ¥ ¸Þ½ÃÁö¸¦ °¡·Îä´Â ½ÃÁ¡¸¸ ´Ù¸£´Ù°í »ý°¢ÇÏ¸é µÇ°Ú½À´Ï´Ù. ÈÅÇÏ´Â µ¥ ÇÊ¿äÇÑ ÇÔ¼ö¸¦ ¸ÕÀú ¼³¸íÇÏ°í ¿¹Á¦¸¦ º¸¸é¼ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
ÀÌ ÇÔ¼ö´Â ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÕ´Ï´Ù. ù ¹øÂ° ÀÎÀÚ´Â ¼³Ä¡ÇϰíÀÚ ÇÏ´Â ÈŠŸÀÔÀ» ÁöÁ¤ÇÕ´Ï´Ù. ÇÁ·Î½ÃÀú¸¦ ÈÅÇÒ ¼ö ÀÖ°í, Űº¸µå ¸Þ½ÃÁö¸¸ µû·Î, ¸¶¿ì½º ¸Þ½ÃÁö¸¸ µû·Î ÈÅ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÈŠŸÀÔ Á¾·ù°¡ ¸¹À¸´Ï ¸Ç ¾Æ·¡ Âü°íÀڷḦ º¸¼¼¿ä. µÎ ¹øÂ° ÀÎÀÚ´Â ÈÅ ÇÁ·Î½ÃÀúÀÇ ¹øÁöÀÔ´Ï´Ù. ¼¼ ¹øÂ° ÀÎÀÚ´Â ÈÅ ÇÁ·Î½ÃÀú¸¦ °¡Áø ÀνºÅϽºÀÇ ÇÚµéÀÔ´Ï´Ù. ±âº»ÀûÀ¸·Î NULLÀ» ³ÖÀ¸¸é µË´Ï´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¸Þ½ÃÁö¸¦ ÈÅÇÒ ¾²·¹µå ¾ÆÀ̵𸦠³Ö¾îÁÖ¸é µË´Ï´Ù.
BOOL UnhookWindowsHookEx(HHOOK hhk);
¼³Ä¡Çß´ø ÈÅÀ» ÇØÁ¦ÇÕ´Ï´Ù. ÇÔ¼ö À̸§ÀÌ Âü Á÷°üÀûÀÌÁÒ. ÇÁ·Î±×·¥À» Á¾·áÇϱâ Àü¿¡ ²À ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ÇÁ·Î±×·¥ÀÌ ¿Àµ¿ÀÛÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÎÀڷδ SetWindowsHookEx() ÇÔ¼ö¸¦ È£Ãâ ÇßÀ» ¶§ ¸®ÅÏ ¹ÞÀº °ªÀ» ³ÖÀ¸¸é µË´Ï´Ù.
LRESULT CallNextHookEx(
HHOOK hhk,
int nCode,
WPARAM wParam,
LPARAM lParam
);
ÀÌ ÇÔ¼ö´Â ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÕ´Ï´Ù. ¼ºêŬ·¡½ÌÀ» ¿©·¯ ¹ø ÇÒ ¼ö ÀÖµíÀÌ ÈÅ ÇÁ·Î½ÃÀúµµ ¿©·¯ ¹ø ¼³Ä¡ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ¿©·¯ °³ ¼³Ä¡µÈ ÈÅ ÇÁ·Î½ÃÀú¸¦ ÈŠüÀÎÀ̶ó°íµµ ºÎ¸¨´Ï´Ù. ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú°¡ ¾ø´Ù¸é À©µµ¿ì ÇÁ·Î½ÃÀú·Î ³Ñ°ÜÁÖ°Ô µË´Ï´Ù.
ù ¹øÂ° ÀÎÀÚ´Â ÇöÀç ÈÅ ÇÁ·Î½ÃÀú ÇÚµéÀÔ´Ï´Ù. ³ª¸ÓÁö ÀÎÀÚµéÀº ¿î¿µÃ¼Á¦°¡ ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô Àü´ÞÇØÁØ ÀÎÀÚµéÀÔ´Ï´Ù. ±×´ë·Î Àü´ÞÇØ ÁÖ¸é µË´Ï´Ù.
À§ ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¿¹Á¦¸¦ Çϳª ¸¸µé¾î º¸°Ú½À´Ï´Ù. À©µµ¿ì Å©±â¸¦ º¯°æ ÇÒ ¶§ ¹Ù²î´Â °ªÀ» ¸ÕÀú Àâ¾Æ¼ Ãâ·ÂÇϵµ·Ï ÇϰڽÀ´Ï´Ù.
óÀ½¿¡ ÈÅ ÇÁ·Î½ÃÀú ÇÚµéÀ» ¼±¾ðÇÕ´Ï´Ù.
µÎ ¹øÂ°·Î ´ÙÀ½ À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÕ´Ï´Ù. ±×¸®°í ¸Þ½ÃÁö¸¦ ¸ÕÀú °¡·Îä´ÂÁö ¾Ë¾Æº¸±â À§Çؼ case WM_SIZE¸¦ ¸¸µé¾î ³õ½À´Ï´Ù. ³ªÁß¿¡ ºê·¹ÀÌÅ© Æ÷ÀÎÆ®¸¦ °É¾î¼ Å×½ºÆ® ÇØ º¸¼¼¿ä.
¼¼ ¹øÂ°·Î ÈÅ ÇÁ·Î½ÃÀú¸¦ ¸¸µì´Ï´Ù. À§ ±×¸²¿¡¼ µÎ ¹øÂ° ÀÎÀÚ¿Í °°Àº À̸§À¸·Î ¸¸µé¾î¾ß°ÚÁÒ.
À§ ¼Ò½º¿¡¼ 224¹øÂ° ÁÙ º¸¸é lParamÀ» PCWPSTRUCT·Î ij½ºÆÃÇÕ´Ï´Ù. CALLWNDPROC·Î ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÏ¿´±â ¶§¹®¿¡ lParamÀ¸·Î CWPSTRUCT ±¸Á¶Ã¼ °ªÀÌ Æ÷ÀÎÅÍ·Î ³Ñ¾î¿É´Ï´Ù. CWPSTRUCT ±¸Á¶Ã¼¿¡´Â ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¶§ ÇÊ¿äÇÑ Á¤º¸µéÀÌ ÀÖ½À´Ï´Ù. CWPSTRUCT Á¤ÀÇ´Â ¾Æ·¡¿Í °°½À´Ï´Ù.
typedef struct {
LPARAM lParam;
WPARAM wParam;
UINT message;
HWND hwnd;
} CWPSTRUCT, *PCWPSTRUCT;
¸¶Áö¸·À¸·Î ÇÁ·Î±×·¥ Á¾·á ½Ã ÈÅ ÇÁ·Î½ÃÀú¸¦ ÇØÁ¦Çϱâ À§ÇÑ ·çƾÀ» ÀÛ¼ºÇÕ´Ï´Ù.
ÀÌÁ¦ ÄÄÆÄÀÏÀ» ÇÏ°í ½ÇÇàÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
ÀÌÁ¦ À©µµ¿ì Å©±â¸¦ º¯°æÇϸé lParam °ªÀÌ º¯°æµË´Ï´Ù.
¾Æ±î ¸¸µé¾î ³õÀº case WM_SIZE¿¡ ºê·¹ÀÌÅ© Æ÷ÀÎÆ®¸¦ °É°í WndProc() ÇÔ¼ö°¡ ¸ÕÀú È£ÃâµÇ´ÂÁö EditHookProc() ÇÔ¼ö°¡ ¸ÕÀú È£ÃâµÇ´ÂÁö »ìÆì º¸¸é EditHookProc°¡ ¸ÕÀú È£ÃâµÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
ÈÅ ÇÏ´Â ¹æ¹ý¿¡´Â ¿©·¯ °¡Áö°¡ ÀÖ½À´Ï´Ù. Űº¸µå³ª ¸¶¿ì½º ¸Þ½ÃÁö¸¸ µû·Î ÈÅÀ» ÇÏ°í ½ÍÀ» °æ¿ì¿¡´Â SetWindowsHookEx() ÇÔ¼ö¿¡ ù ¹øÂ° ÀÎÀÚ¸¦ WH_KEYBOARD, WH_MOUSE·Î µÎ°í ÈÅ ÇÁ·Î½ÃÀú¸¦ ÀÛ¼ºÇÏ¸é µË´Ï´Ù. ±× ¹Û¿¡ ¿©·¯ °¡Áö ÈÅ ±â´ÉµéÀÌ ÀÖÀ¸´Ï Âü°í ÀÚ·á¿¡ ÀÖ´Â »çÀÌÆ®¸¦ ÅëÇØ °øºÎÇÏ¸é µÇ°Ú½À´Ï´Ù.
¸Þ½ÃÁö ÈÅÀº ´õ ³ÐÀº ¹üÀ§¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ù·Î Àü¿ª ÈÅÀ̶ó´Â ±â´ÉÀÌ Àֱ⠶§¹®ÀÌÁÒ. ÀÚ½ÅÀÌ ¸¸µç ÈÅ ÇÁ·Î½ÃÀú¸¦ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ Àû¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Áï, ´Ù¸¥ ÇÁ·Î¼¼½ºµµ ÄÁÆ®·Ñ ÇÒ ¼ö°¡ ÀÖ°Ô µË´Ï´Ù. ½ÇÁ¦ º¸¾È ÇÁ·Î±×·¥À̳ª ¾Ç¼º ÇÁ·Î±×·¥µéÀÌ ÀÌ·± ±â¹ýÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù.
Àü¿ª ÈÅ ±â¹ý¿¡´Â DLL InjectionÀ» ÀÌ¿ëÇÑ ¹æ¹ý°ú Low Level·Î ³»·Á°¡¼ ÈÅÀ» ÇÏ´Â ¹æ¹ý µîÀÌ ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýµéÀ» °øºÎÇϱâ À§Çؼ DLL°ú ¸Þ¸ð¸® ±¸Á¶ µî¿¡ ´ëÇÑ °³³äÀ» ¾Ë¾Æ¾ß Çϴµ¥, °Á°¡ ³Ê¹« ±æ¾îÁö¸é Áö·çÇϱ⿡ À̹ø °Á¿¡¼´Â ÇÏÁö ¾Êµµ·Ï ÇϰڽÀ´Ï´Ù. ´ÙÀ½¿¡ DLL°ú ¸Þ¸ð¸® ±¸Á¶¿¡ ´ëÇØ ´õ °øºÎ¸¦ ÇÑ µÚ¿¡ Àü¿ª ÈÅ ¹æ¹ýµé¿¡ ´ëÇØ¼ ¼³¸íÀ» Çϵµ·Ï ÇϰڽÀ´Ï´Ù.
@ Âü°íÀÚ·á
¡Û À©µµ¿ì ÈÅ °ü·Ã ÇÔ¼ö
- SetWindowsHookEx() : ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÕ´Ï´Ù.
http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
- CallNextHookEx() : ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÕ´Ï´Ù.
http://msdn.microsoft.com/en-us/library/ms644974(VS.85).aspx
- UnhookWindowsHookEx() : ¼³Ä¡ÇÑ ÈÅ ÇÁ·Î½ÃÀú¸¦ ÇØÁ¦ÇÕ´Ï´Ù.
http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx
- CWPSTRUCT Structure : CALLWNDPROC ÇÁ·Î½ÃÀú·Î º¸³»Áö´Â Á¤º¸µéÀ» ´ãÀº ±¸Á¶Ã¼
http://msdn.microsoft.com/en-us/library/ms644964(VS.85).aspx