µû¶óÇØº¸´Â ÈÄÅ·

ÀÛ¼ºÀÚ : ÀÌÀº±Ô

ÀÛ¼ºÀÏ : 2003.11.02

ȨÆäÀÌÁö : http://unkyulee.net

¿öµå¹®¼­ : http://unkyulee.net/files/hooking_lecture.doc

¼Ò½º : http://unkyulee.net/files/hooking_src.zip

 

¸ñÂ÷

1. µé¾î°¡´Â ±Û

2. ÈÄÅ·À̶õ?

3. ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ¸¸µé¾î º¸ÀÚ.

4. ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ½ÃÀÛ, Á¾·áÇÏ´Â ÇÔ¼ö

5. ÇÁ·Î½ÃÁ® ³»¿¡¼­ ´Ù¸¥ À©µµ¿ì·Î µ¥ÀÌÅÍ Àü¼ÛÇϱâ

6. °£´ÜÇÑ »ùÇà ÇÁ·Î±×·¥

 


1. µé¾î°¡´Â ±Û

 

 "±×³É ½ÇÇàµÇ´Â °É º¸°í ½Í¾ú´Ù."

 

 ¿¹Àü¿¡ Çß´ø ÇÁ·ÎÁ§Æ®ÀÇ ³»¿ë Áß¿¡ »ç¿ëÀÚ°¡ Űº¸µå·Î ÀÔ·ÂÇÏ´Â ³»¿ëÀ» ¾ò¾î¿Í¼­ ó¸®ÇØ¾ß µÇ´Â ºÎºÐÀÌ ÀÖ¾ú´Ù. ÀÌ·¯ÇÑ ±â´ÉÀ» ±¸ÇöÇϱâ À§Çؼ­´Â ÈÄÅ· À̶ó´Â ±â¼úÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¡¼­ °ü·ÃµÈ ³»¿ëÀ» ÀÎÅͳݿ¡¼­ ã¾ÆºÃ´Âµ¥, ¿Ö ÀÌ·¸°Ô ¾Ë¾Æ¾ß µÇ´Â ³»¿ëÀÌ ¸¹ÀºÁö¡¦ ¶Ç ³»¿ëµéÀº ¾îÂ ¾î·Æ´øÁö¡¦ ÈÄÅ· ±¸ÇöÇÑ´ä½Ã°í ÇÑ´Þ ³»³» ¹®¼­ Àаí ÀÎÅÍ³Ý µÚÁö°í ¾öû °í»ý Çß¾ú´Ù. °á±¹ °£´ÜÇÑ »ùÇà Äڵ带 ±¸Çؼ­ ¿øÇÏ´Â ±â´ÉÀ» ±¸Çö Çß´ø ±â¾ïÀÌ ÀÖ´Ù.

 

 ÇÁ·ÎÁ§Æ® ³»¿¡¼­ ±×¸® Áß¿äÇÑ ºÎºÐµµ ¾Æ´Ï¿´°í, ±×³É È£±â½É¿¡ ÈÄÅ·À̶ó´Â °É ½ÇÁ¦·Î ±¸ÇöÇØº¸°í ½Í¾ú´ø °Í »ÓÀÌ¿´´Âµ¥, Á¤¸» ¾î·Æ°Ô °øºÎÇß´ø °Í °°´Ù.

 

 ÀÌ °­Á´ ¼øÀüÈ÷ È£±â½ÉÀ¸·Î ȤÀº ±×³É(?) Çѹø ÈÄÅ·À» ½ÇÁ¦·Î ±¸ÇöÇØ º¸°íÀÚ ÇÏ´Â »ç¶÷µéÀ» ´ë»óÀ¸·Î ÇÑ´Ù. ÈÄÅ·¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ÀÌ·ÐÀº ´ëºÎºÐ »ý·«ÇÒ ¿¹Á¤ÀÌ´Ù. ´ë½Å¿¡ ÀÌ °­Á¸¦ ´Ù ÀÐ°í ³ª¸é ÈÄÅ·À» »ç¿ëÇÑ, ÀÏ´Ü µ¹¾Æ°¡´Â Äڵ带 ÀÛ¼º ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

 ÀÏ´Ü µ¹¾Æ°¡´Â Äڵ带 ÀÛ¼ºÇÏ°í ³ª¸é, ±× ¿ÜÀÇ ³»¿ëÀ» ÀÍÈ÷´Â °ÍÀº ½Ã°£ ¹®Á¦ÀÏ »ÓÀÌÁö ¾ÊÀ»±î »ý°¢ÇÑ´Ù. ^0^)

 


2. ÈÄÅ·À̶õ?

 

 "ÈÄÅ·Àº µµÃ»ÇÏ´Â °É ¿¹·Î µé¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ´Ù."

 

 ÈÄÅ·À̶õ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ °É·Á¼­(Hooked) ÇØ´ç ÇÁ·Î¼¼½ºÀÇ Á¤º¸¸¦ ¾ò¾î ¿À°Å³ª, º¯°æÇÏ´Â °ÍÀÌ °¡´ÉÇÑ ±â¼úÀÌ´Ù. ¿©±â¼­ ÇÁ·Î¼¼½º¶õ Á¼°Ô ºÁ¼­ "À©µµ¿ì ÇÁ·Î½ÃÁ®" ȤÀº "À©µµ¿ì ¸Þ½ÃÁö" ¶ó°í »ý°¢ÇÏ¸é µÇ°Ú´Ù.

 

 ¿¹¸¦ µé¾î º¸ÀÚ. ÇÑ ¾ÆÆÄÆ® °Ç¹°ÀÌ ÀÖ´Ù°í ÇÏÀÚ. ±×¸®°í ÀÌ °Ç¹°À» µµÃ»ÇÏ°í ½Í´Ù. ±×·³ ÀüÈ­¼±µéÀÌ Áö³ª°¡´Â °÷(Window Process) ¿¡ µµÃ» ÀåÄ¡(ÈÄÅ· ÇÁ·Î½ÃÁ®)¸¦ ¼³Ä¡ÇÑ´Ù. ±×·³ µµÃ»ÀåÄ¡ »çÀÌ·Î ÀüÈ­ ³»¿ëµéÀÌ(Window Message) Áö³ª°£´Ù. µµÃ» ÀåÄ¡´Â ±× Áß ÇÊ¿äÇÑ ¸Þ½ÃÁö¸¦ ÀúÀåÇϰí Àְųª, ÇÊ¿äÇÑ °÷À¸·Î Àü¼ÛÇÑ´Ù.

 

 À§ÀÇ °úÁ¤µé¿¡ ÀÇÇØ¼­ ºôµùÀº µµÃ»À» ´çÇÑ´Ù. ±×·³ ½ÇÁ¦ ÈÄÅ·ÀÇ °æ¿ì¸¦ »ìÆìº¸ÀÚ. ÀÏ´Ü À©µµ¿ì ¸Þ½ÃÁö(ÀüÈ­ ³»¿ë)¸¦ ÈÄÅ· ÇÑ´Ù°í Çϸé À©µµ¿ì ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŰ´Â °÷(ÀüÈ­¼±µéÀÌ Áö³ª°¡´Â °÷)¿¡ ÈÄÅ· ÇÁ·Î½ÃÁ®(µµÃ» ÀåÄ¡)¸¦ ¼³Ä¡ÇÑ´Ù. ±×·³ ÇØ´ç À©µµ¿ì¿¡¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö°¡ ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ °ÅÃİ¡°Ô µÈ´Ù. ±×·³ ÈÄÅ· ÇÁ·Î½ÃÁ®´Â ¸Þ½ÃÁöµéÀ» º¸°í ÇÊ¿äÇÑ ³»¿ëÀ» ÀúÀåÇÏ´øÁö ÇÊ¿äÇÑ °÷¿¡ Àü´ÞÀ» ÇÏ¸é µÇ´Â °ÍÀÌ´Ù.

 

 ±×¸² Çѹø º¸ÀÚ. À§ ±×¸²Àº Ivo Ivanov ¶ó´Â »ç¶÷ÀÌ ¾´ API Hooking Reveal ¶ó´Â ¹®¼­¿¡¼­ ÆÛ °¡Áö°í ¿Ô´Ù. ±×¸²À» º¸¸é Hook Driver ¶ó´Â °ÍµéÀÌ 3°³°¡ º¸ÀδÙ. ±×¸²¿¡¼­ ÇöÀç À©µµ¿ì°¡ 3 °³°¡ ¶°Àִµ¥ °¢°¢ÀÇ À©µµ¿ì¿¡ Çϳª¾¿ Hook Driver °¡ ºÙ¾î ÀÖ´Â ¸ð¾çÀÌ´Ù. µû¶ó¼­ ÀÌ µå¶óÀ̹ö(ÈÄÅ· ÇÁ·Î½ÃÁ®) µéÀÌ °¢°¢ÀÇ À©µµ¿ì¿¡¼­ ¿À´Â ¸Þ½ÃÁöµéÀ» ¹ÞÀ» ¼ö°¡ ÀÖ´Â °ÍÀÌ´Ù.

 

 ¹º°¡ ±²ÀåÈ÷ ¸¹¾Æ º¸ÀδÙ. ÇÏÁö¸¸ °á±¹ °³¹ßÀÚ°¡ ¸¸µé¾î ÁÖ´Â °ÍÀº ÈÄÅ· ÇÁ·Î½ÃÁ® ÇϳªÀÌ´Ù.

 

 ¿©±â¼­ ŰÆ÷ÀÎÆ®´Â ƯÁ¤ À§µµ¿ì°¡ ¹Þ´Â ¸Þ½ÃÁö¸¦ ÈÄÅ· ÇÁ·Î½ÃÁ®µµ ¹ÞÀ» ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ·± ±â¼úÀ» ¹Ù·Î ÈÄÅ·À̶ó°í ÇÑ´Ù.

 

 


3. ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ¸¸µé¾î º¸ÀÚ.

 

 "ÀÌ·ÐÀº ³¡³µ´Ù. ÀÌÁ¦ ¸¸µé¾î º¸ÀÚ."

 

 ÈÄÅ· ÇÁ·Î½ÃÁ®¡¦ ¾Æ±îºÎÅÍ ÇÁ·Î½ÃÁ®¶ó´Â ´Ü¾î°¡ °è¼Ó ³ª¿À´Âµ¥ °á±¹ ÇÁ·Î½ÃÁ®´Â ÇÔ¼ö¿Í ±× Àǹ̰¡ ºñ½ÁÇÏ´Ù. µû¶ó¼­ ÈÄÅ· ÇÁ·Î½ÃÁ®¶ó°í ÇÔÀº ÈÄÅ·À» ÇÏ´Â ÇÔ¼ö¶ó°í »ý°¢ÇÏÀÚ. µû¶ó¼­ ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ¸¸µç´Ù´Â °ÍÀº ÇÔ¼ö¸¦ Çϳª ¸¸µç´Ù°í »ý°¢ÇÏ¸é µÈ´Ù.

 

 ÈÄÅ· ÇÔ¼ö¸¦ ¸¸µé±â À§Çؼ­´Â ÁöÄÑ¾ß ÇÏ´Â ±ÔÄ¢µéÀÌ ÀÖ´Ù.

1. Call Back ÇÔ¼öÀÌ¿©¾ß ÇÑ´Ù.

2. ÇÔ¼öÀÇ ¸¶Áö¸· ºÎºÐ¿¡¼­´Â CallNextHookEx() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

3. ÇÔ¼ö°¡ ¹Þ´Â ÀÎÀÚ´Â Á¤ÇØÁ® ÀÖ´Ù.

4. ÈÄÅ· ÇÁ·Î½ÃÁ®´Â DLL ¾È¿¡ ÀÖ¾î¾ß ÇÑ´Ù.

 

Ex)

//--------------------------------------------------------------

// Hook Procedure - Keyboard

//--------------------------------------------------------------

LRESULT CALLBACK KeyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)

{

             if( nCode >= 0 )

             {

            

             }

             // We must pass the all messages on to CallNextHookEx.

           return ::CallNextHookEx( g_Hook , nCode , wParam , lParam );

}

 

 À§ÀÇ ±ÔÄ¢µéÀ» ÁöÄѼ­ ¸¸µç ÈÄÅ· ÇÁ·Î½ÃÁ® ÇÔ¼öÀÌ´Ù.

 

 4¹øÂ° ±ÔÄ¢¿¡ ÀÇÇϸé ÈÄÅ· ÇÔ¼ö´Â DLL ³»ºÎ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. Visual C++ 6.0 ¿¡¼­ DLL ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µé¾î º¸ÀÚ.

 

Step 1. Win32 Dynamic-Link Library ÇÁ·ÎÁ§Æ® »ý¼º

Step 2. Simple ÇÁ·ÎÁ§Æ® ¼±Åà ÈÄ Finish

Step 3. cpp ÆÄÀÏ¿¡ À§ÀÇ ÈÄÅ· ÇÔ¼ö¸¦ ¸¸µé¾î ÁØ´Ù.

 

À§ÀÇ ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏ Çϸé HookDll.dll ÆÄÀÏÀÌ »ý¼ºµÈ´Ù.

 

Àüü ÇÁ·ÎÁ§Æ® ÆÄÀÏ ³»¿ë

// HookDll.cpp : Defines the entry point for the DLL application.

//

 

#include "stdafx.h"

 

BOOL APIENTRY DllMain( HANDLE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

                                                                   )

{

    return TRUE;

}

 

//--------------------------------------------------------------

// Hook Procedure - Keyboard

//--------------------------------------------------------------

LRESULT CALLBACK KeyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)

{

             if( nCode >= 0 )

             {

                          

             }

             // We must pass the all messages on to CallNextHookEx.

             return ::CallNextHookEx( g_Hook , nCode , wParam , lParam );

}

 

 

 


4. ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ½ÃÀÛ, Á¾·áÇÏ´Â ÇÔ¼ö

 

 À̹ø ´Ü°è¿¡¼­´Â ¾Õ¼­ ¸¸µç ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ¼³Ä¡Çϰí, Á¦°ÅÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸°Ú´Ù. ÈÄÅ· ÇÁ·Î½ÃÁ®´Â ƯÁ¤ À©µµ¿ì¿¡ ¼³Ä¡°¡ µÇ¾î¾ß Á¦ ¿ªÇÒÀ» ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. À̶§ ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ¼³Ä¡ÇØÁÖ´Â ÇÔ¼ö°¡ ¹Ù·Î SetWindowsHookEx() ÀÌ´Ù. ±× ´ÙÀ½¿¡ ¼³Ä¡µÈ ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ Á¦°ÅÇϱâ À§Çؼ­´Â UnhookWindowsHookEx() °¡ ¾²ÀÌ°Ô µÈ´Ù. °¢°¢ÀÇ »ç¿ë¹ýÀ» ¾Ë¾Æº¸°í ¾Õ¿¡¼­ ¸¸µç ÇÁ·ÎÁ§Æ®¿¡ À̾ Àû¿ë½ÃÄÑ º¸ÀÚ.

 

SetWindowsHookEx()ÀÇ »ç¿ë¹ý

HHOOK SetWindowsHookEx(

    int idHook,

    HOOKPROC lpfn,

    HINSTANCE hMod,

    DWORD dwThreadId

);

 

 Ã¹¹øÂ° ÆÐ·¯¸ÞÅÍ´Â ÈÄÅ· ÇÊÅ͸¦ ¼³Á¤ÇÑ´Ù. ÈÄÅ· ÇÁ·Î½ÃÁ®°¡ ¹ÞÀº ¸Þ½ÃÁöÀÇ Á¾·ù¸¦ ¼³Á¤ÇÏ´Â Ç׸ñÀÌ´Ù. ¿¹¸¦ µé¾î WH_GETMESSAGE·Î ¼³Á¤ÇÏ¸é ¸ðµç ¸Þ½ÃÁö¸¦ ¹Þ°Ô µÇ°í, WH_KEYBOARD·Î ¼³Á¤ÇÏ°Ô µÇ¸é Űº¸µå °ü·Ã ¸Þ½ÃÁö¸¸ Àü´Þ ¹Þ°Ô µÈ´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº MSDN À» Âü°íÇϱ⠹ٶõ´Ù.

 

 µÎ¹øÀç ÆÐ·¯¸ÞÅÍ´Â ÈÄÅ· ÇÁ·Î½ÃÁ®ÀÇ Æ÷ÀÎÅ͸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. °£´ÜÇÏ°Ô ÈÄÅ· ÇÁ·Î½ÃÁ® ÇÔ¼ö À̸§ ½áÁÖ¸é µÈ´Ù.

 

 ¼¼¹øÂ° ÆÐ·¯¸ÞÅÍ´Â DLL ÀÇ ÇÚµéÀ» ³Ñ°ÜÁà¾ß µÈ´Ù. ÀÌ °ªÀº ¾Õ¿¡¼­ ¸¸µç ÇÁ·ÎÁ§Æ®¿¡¼­ DLlMain() ÇÔ¼ö¸¦ º¸¸é HANDLE hModule °ªÀÌ ³Ñ¾î¿À´Âµ¥ ÀÌ°É ÀúÀå ÇØ³ù´Ù°¡ ³Ñ°ÜÁÖ¸é µÈ´Ù.

 

 ³×¹øÂ° ÆÐ·¯¸ÞÅÍ´Â ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ¼³Ä¡ÇÒ À©µµ¿ì °ªÀ» ³Ñ°ÜÁØ´Ù. À̹ø ¿¹¿¡¼­´Â 0 À» ³Ñ°ÜÁØ´Ù. 0 À» ³Ñ°ÜÁÖ¸é ÈÄÅ· ÇÁ·Î½ÃÁ®°¡ ¸ðµç À©µµ¿ì¿¡ ¼³Ä¡°¡ µÈ´Ù.

 

 ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â °ªÀ» Àß ÀúÀå ÇØ ³õÀÚ. ³ªÁß¿¡ ÈÄÅ·À» ÇØÁ¦ÇÒ ¶§ ÇÊ¿äÇÏ°Ô µÈ´Ù.

 

Ex) g_HookKeyboard = SetWindowsHookEx( WH_KEYBOARD , KeyboardProcedure , (HINSTANCE)g_Module , 0 ) ;

 

UnhookWindowsHookEx() ÀÇ »ç¿ë¹ý

 

BOOL UnhookWindowsHookEx(         

             HHOOK hhk

);

 

 ÀÌ ÇÔ¼ö´Â ÈÄÅ· ÇÚµéÀ» ¹Þ¾Æ¼­ ÇØ´ç ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ ÇØÁ¦ÇÑ´Ù. À̶§ ¹Þ´Â ÇÚµéÀº SetWindowsHookEx() ÇÔ¼ö°¡ ¸®ÅÏÇÑ °ªÀ» ³Ö¾îÁÖ¸é µÈ´Ù.

 

 

ÇÁ·ÎÁ§Æ®¸¦ °è¼Ó ÁøÇà ÇØº¸ÀÚ.

 

1. ÇÊ¿äÇÑ Àü¿ª º¯¼ö¸¦ ¸¸µé¾î ÁØ´Ù.

//---------------------------------------------------

// Global Variables

// °ø¿ë ¸Þ¸ð¸®

//---------------------------------------------------

#pragma data_seg(".HKT")

HINSTANCE g_Module = NULL ;     // DLL Handle

HHOOK g_Hook = NULL ;  // Hook Handle

HWND g_HwndServer = NULL ;      // Hook Server Window Handle

#pragma data_seg()

 

 

2. SetHook, Remove À̶ó´Â ÇÔ¼ö¸¦ ¸¸µç´Ù.

//------------------------------------------------------------------// Set Hook

//------------------------------------------------------------------BOOL     SetHook( HWND hWnd )

{

             g_HwndServer = hWnd ;                // Set Hook Server

             g_Hook = SetWindowsHookEx( WH_KEYBOARD , KeyboardProcedure , (HINSTANCE)g_Module , 0 ) ;

             return false ;

}

 

//------------------------------------------------------------------// Remove Hook

//------------------------------------------------------------------BOOL     RemoveHook()

{

             UnhookWindowsHookEx( g_Hook ) ;

             return false;

}

 

 

// HookDll.def ÆÄÀÏ ºÎºÐ

LIBRARY   HookDll

 

SECTIONS

             .HKT   Read Write Shared

 

EXPORTS

             SetImeWindow                 @1

             SetHook                                        @2

             RemoveHook                                 @3

 

 

 

3.. À§ÀÇ ÇÔ¼ö¿Í Àü¿ª º¯¼öÀÇ ¼¼ÆÃÀ» À§ÇÑ [ÇÁ·ÎÁ§Æ®¸í].def ÆÄÀÏÀ» ¸¸µé¾î ÁØ´Ù.

LIBRARY   [ÇÁ·ÎÁ§Æ®¸í]

 

SECTIONS

             .HKT   Read Write Shared

 

EXPORTS

             SetHook                                        @2

             RemoveHook                                 @3

 

 

4. DllMail ÇÔ¼ö¿¡¼­ ÇÚµéÀ» ÀúÀåÇÑ´Ù.

//------------------------------------------------------------------// DllMain : Entry point

//------------------------------------------------------------------BOOL APIENTRY DllMain( HANDLE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

                                                                   )

{

             switch (ul_reason_for_call)

             {

             case DLL_PROCESS_ATTACH:

                           g_Module = (HINSTANCE)hModule; // Save Dll Handle

                           break;

 

             case DLL_PROCESS_DETACH:

                           RemoveHook();

                           break;

    }

 

    return TRUE;

}

 

 

Àüü ÇÁ·ÎÁ§Æ® ÆÄÀÏ

 

1. HookDll.cpp

// HookDll.cpp : Defines the entry point for the DLL application.

//

 

#include "stdafx.h"

 

//---------------------------------------------------

// Global Variables

// °ø¿ë ¸Þ¸ð¸®

//---------------------------------------------------

#pragma data_seg(".HKT")

HINSTANCE g_Module = NULL ;     // DLL Handle

HHOOK g_Hook = NULL ;  // Hook Handle

HWND g_HwndServer = NULL ;      // Hook Server Window Handle

#pragma data_seg()

 

BOOL    RemoveHook() ;

BOOL    SetHook( HWND hWnd ) ;

 

//------------------------------------------------------------------

// DllMain : Entry point

//------------------------------------------------------------------

BOOL APIENTRY DllMain(

                                                                                HANDLE hModule,

                                                                                DWORD  ul_reason_for_call,

                                                                                LPVOID lpReserved

                                                                  )

{

             switch (ul_reason_for_call)

             {

             case DLL_PROCESS_ATTACH:

                           g_Module = (HINSTANCE)hModule; // Save Dll Handle

                           break;

                          

             case DLL_PROCESS_DETACH:

                           RemoveHook();

                           break;

    }

            

    return TRUE;

}

 

//--------------------------------------------------------------

// Hook Procedure - Keyboard

//--------------------------------------------------------------

LRESULT CALLBACK KeyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)

{

             if( nCode >= 0 )

             {

                          

             }

             // We must pass the all messages on to CallNextHookEx.

             return ::CallNextHookEx( g_Hook , nCode , wParam , lParam );

}

 

//------------------------------------------------------------------

// Set Hook

//------------------------------------------------------------------

BOOL    SetHook( HWND hWnd )

{

             g_HwndServer = hWnd ;                // Set Hook Server

             g_Hook = SetWindowsHookEx( WH_KEYBOARD , KeyboardProcedure , (HINSTANCE)g_Module , 0 ) ;

            

             return false ;

}

 

//------------------------------------------------------------------

// Remove Hook

//------------------------------------------------------------------

BOOL    RemoveHook()

{

             UnhookWindowsHookEx( g_Hook ) ;

             return true ;

}

 

 

2. HookDll.def ÆÄÀÏ

LIBRARY   HookDll

 

SECTIONS

.HKT   Read Write Shared

 

EXPORTS

SetHook                                        @2

RemoveHook                                 @3

 

 

ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏ Çϸé HookDll.lib ¿Í HookDll.dll ÆÄÀÏÀÌ »ý¼ºÀÌ µÈ´Ù.


5. ÇÁ·Î½ÃÁ® ³»¿¡¼­ ´Ù¸¥ À©µµ¿ì·Î µ¥ÀÌÅÍ Àü¼ÛÇϱâ

 

 À̹ø¿¡´Â ¾Õ¼­ ¸¸µç ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ Á»´õ °­È­Çغ¸±â·Î ÇÏÀÚ. ÈÄÅ· ÇÁ·Î½ÃÁ® ³»¿¡¼­ ¸Þ½ÃÁö¸¦ ¹Þ°í ¹ÞÀº ¸Þ½ÃÁö¸¦ º¹»çÇÏ¿© ƯÁ¤ À©µµ¿ì¿¡°Ô º¸³¾ °ÍÀÌ´Ù.

 

 À̶§ WM_COPYDATA ¸Þ½ÃÁö¸¦ »ý¼º ÇÒ °ÍÀÌ´Ù.

 

1. WM_COPYDATA ·Î º¸³¾ µ¥ÀÌÅÍÀÇ ±¸Á¶¸¦ Á¤ÀÇÇÑ´Ù.

// ¸Þ½ÃÁö¸¦ ÀúÀåÇÏ´Â ±¸Á¶Ã¼

typedef struct

{

             int                       Type ;

             WPARAM            Data ;

             LPARAM              lParam ;

} HEVENT;

 À©µµ¿ì ¸Þ½ÃÁöÀÇ ³»¿ëÀ» ÀúÀåÇÒ ±¸Á¶Ã¼

 

 

2. ÇöÀçÀÇ ¸Þ½ÃÁö¸¦ º¹»çÇÑ´Ù.

COPYDATASTRUCT  CDS;

HEVENT          Event;

 

// Set CDS

CDS.dwData = 0 ;

CDS.cbData = sizeof(Event);

CDS.lpData = &Event;

 

// ¸Þ½ÃÁöÀÇ ³»¿ëÀ» ÀúÀåÇÑ´Ù.

Event.Type = 1 ;               // It's WM_KEY..

Event.Data = wParam ;     // Send CharCode

Event.lParam = lParam ;

 

 

3. g_HwndServer ¿¡°Ô·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇÑ´Ù.

// g_HwndServer  ¿¡°Ô·Î ¸Þ½ÃÁö¸¦ ³¯¸°´Ù.

// g_HwndServer ´Â SetHook ÇÔ¼ö È£Ãâ½Ã ÀúÀåÇÑ À©µµ¿ì ÇÚµéÀÌ´Ù.

::SendMessage( g_HwndServer , WM_COPYDATA , 0 , (LPARAM)(VOID*)&CDS ) ;

 

 

 

ÇÁ·ÎÁ§Æ®¸¦ °è¼Ó ÁøÇà ÇØº¸ÀÚ.

 

1. ¾Õ¼± ÇÁ·ÎÁ§Æ®ÀÇ ³»¿ë Áß KeyboardProcedure() ÇÔ¼öÀÇ ³»¿ëÀ» ¼öÁ¤ÇÑ´Ù.

 

//------------------------------------------------------------------

// Hook Procedure - Keyboard

//------------------------------------------------------------------

LRESULT CALLBACK KeyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)

{

             if( nCode >= 0 )

             {

                           // Send To HookServer

                           COPYDATASTRUCT  CDS;

                           HEVENT          Event;

                           // Set CDS

                           CDS.dwData = 0 ;

                           CDS.cbData = sizeof(Event);

                           CDS.lpData = &Event;

                           // Set Variables

                           Event.Type = 1 ;               // It's WM_KEY..

                           Event.Data = wParam ;     // Send CharCode

                           Event.lParam = lParam ;

                          

                            ::SendMessage( g_HwndServer , WM_COPYDATA , 0 , (LPARAM)(VOID*)&CDS ) ;    

             }

 

             // We must pass the all messages on to CallNextHookEx.

             return ::CallNextHookEx( g_Hook , nCode , wParam , lParam );

}

 

 

2. Event ±¸Á¶Ã¼¸¦ Á¤ÀÇ ÇØÁØ´Ù.

typedef struct

{

             int                       Type ;

             WPARAM            Data ;

             LPARAM              lParam ;

} HEVENT;


6. °£´ÜÇÑ »ùÇà ÇÁ·Î±×·¥

 

 Áö±Ý±îÁö ¸¸µé¾î º» ÈÄÅ· ÇÁ·Î½ÃÁ®¸¦ °¡Áö°í ½ÇÁ¦·Î »ùÇà ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸ÀÚ.

 

 

1. ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑ´Ù.

             - MFC ´ÙÀ̾ó·Î±×

 

2. À§ÀÇ ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏ Çϸé HookDll.lib ¿Í HookDll.dll ÆÄÀÏÀÌ »ý¼ºÀÌ µÈ´Ù. ÀÌ ÆÄÀÏÀ» »õ·Ó°Ô »ý¼ºÇÒ ÇÁ·ÎÁ§Æ® Æú´õ¿¡ º¹»çÇÑ´Ù.

 

3. ÇÁ·ÎÁ§Æ®¸¦ ¼¼ÆÃÇÑ´Ù.

             - ¸Þ´º¿¡¼­ Project -> Setting -> Link ÅÇ¿¡¼­ Object/Modules Library Ä­¿¡ HookDll.lib ¸¦ ÁöÁ¤ÇÑ´Ù.

 

 

 

4 . ´ÙÀ̾ó·Î±×¸¦ À§ÀÇ ¸ð¾ç°°ÀÌ ¸¸µé¾î ÁÖ°í

¿¡µðÆ® ÄÁÆ®·ÑÀ» »ý¼ºÇÏ°í ´ÙÀ½°ú °°ÀÌ º¯¼ö¸¦ ¿¬°áÇØÁØ´Ù..

 

ID : IDC_EDIT_CNT

Value : m_Cnt

Type : int


5. Ŭ·¡½º À§Àúµå·Î WM_COPYDATA ¸Þ½ÃÁö Çڵ鷯¸¦ »ý¼ºÇÑ´Ù.

BOOL CHookTestDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

{

             // TODO: Add your message handler code here and/or call default

            

             // WM_COPYDATA ¸Þ½ÃÁö°¡ ¿Ã¶§¸¶´Ù Ä«¿îÆ®¸¦ Áõ°¡ÇÑ´Ù.

             m_Cnt++ ;

             UpdateData( false ) ;

 

             return CDialog::OnCopyData(pWnd, pCopyDataStruct);

}

 

À§¿Í °°ÀÌ ¼öÁ¤ÇØÁØ´Ù.

 

6. DLL ¿¡ ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§ÇØ Çì´õ ÆÄÀÏ¿¡ ´ÙÀ½À» Ãß°¡ÇÑ´Ù.

BOOL    RemoveHook() ;

BOOL    SetHook( HWND hWnd ) ;

 

 

7. InitDialog() ÇÔ¼ö¿¡¼­ SetHook() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

BOOL CHookTestDlg::OnInitDialog()

{

             CDialog::OnInitDialog();

 

             // Add "About..." menu item to system menu.

 

             // IDM_ABOUTBOX must be in the system command range.

             ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

             ASSERT(IDM_ABOUTBOX < 0xF000);

 

             CMenu* pSysMenu = GetSystemMenu(FALSE);

             if (pSysMenu != NULL)

             {

                           CString strAboutMenu;

                           strAboutMenu.LoadString(IDS_ABOUTBOX);

                           if (!strAboutMenu.IsEmpty())

                           {

                                        pSysMenu->AppendMenu(MF_SEPARATOR);

                                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

                           }

             }

 

             // Set the icon for this dialog.  The framework does this automatically

             //  when the application's main window is not a dialog

             SetIcon(m_hIcon, TRUE);                           // Set big icon

             SetIcon(m_hIcon, FALSE);                          // Set small icon

            

             // TODO: Add extra initialization here

             SetHook( this->GetSafeHwnd() ) ; // ÈÄÅ· ÇÁ·Î½ÃÁ® ¼³Ä¡

            

             return TRUE;  // return TRUE  unless you set the focus to a control

}

 

ÀÚ ÀÌÁ¦ ½ÇÇàÇϸé Űº¸µå¸¦ Ä¥ ¶§¸¶´Ù Ä«¿îÆ®°¡ Áõ°¡ÇÏ´Â ÇÁ·Î±×·¥ÀÌ ¿Ï¼ºÀÌ µÇ¾ú´Ù.