¶ó. Àü¿ª ÈÅ

Àü¿ª ÈÅÀº ½Ã½ºÅÛ¿¡¼­ ¹ß»ýÇÏ´Â ¸ðµç ¸Þ½ÃÁö¸¦ °¡·Îç ¼ö ÀÖÀ¸¹Ç·Î °­·ÂÇϰí Ȱ¿ë¼ºµµ ³ô´Ù. ÇÏÁö¸¸ º¸È£µÈ Win32 ȯ°æÀÇ Æ¯¼ö¼ºÀ¸·Î ÀÎÇØ ÇÁ·Î±×·¡¹ÖÇϱâ´Â ¹«Ã´ ¾î·Á¿î ÆíÀε¥ Àü¿ª ÈÅÀ» Á¦´ë·Î ÀÌÇØÇÏ·Á¸é Win32ÀÇ ¸Þ¸ð¸® ±¸Á¶, DLL, IPC, ½º·¹µå, ¸Þ½ÃÁö Àü´Þ ü°è, PE ÆÄÀÏÀÇ ±¸Á¶¿¡ ´ëÇÑ ÀÌÇØ°¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼­ Àü¿ª ÈÅÀ» Á¦´ë·Î ÀÌÇØÇÏ·Á¸é ÀÌ·± ¼±¼ö °ú¸ñÀ» ¸ÕÀú °øºÎÇÑ ÈÄ¿¡ º¼ °ÍÀ» ±ÇÀåÇÑ´Ù.

¸Þ½ÃÁöµéÀº ¹ß»ýÇÑ »ç°Ç¿¡ ´ëÇÑ Á¤º¸¸¦ wParam, lParam Àμö·Î º¸³»´Âµ¥ ÀÌ µÎ Àμö·Î Àü´ÞµÇ´Â °ªÀº º¸Åë Á¤¼ö³ª ÇÚµé µîÀÇ ´Ü¼ø°ªÀÌÁö¸¸ ÀϺΠº¹ÀâÇÑ ¸Þ½ÃÁö(WM_CREATE, WM_DRAWITEM)´Â ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇϱ⵵ ÇÑ´Ù. Àü¿ª ÈÅ ÇÁ·Î½ÃÀú´Â ½Ã½ºÅÛÀÇ ¸ðµç ½º·¹µå¿¡¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöµéÀ» °¨½ÃÇϴµ¥ ÈÅ ÇÁ·Î½ÃÀú°¡ ¸Þ½ÃÁö¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÐÀ¸·Á¸é Àü´ÞµÈ ±¸Á¶Ã¼ Æ÷ÀÎÅͷκÎÅÍ ¸â¹ö¸¦ ÀÐÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

±×·¯³ª Win32 ȯ°æ¿¡¼­´Â ÇÁ·Î¼¼½ºµéÀÇ ÁÖ¼Ò °ø°£ÀÌ ºÐ¸®µÇ¾î Àֱ⠶§¹®¿¡ ÀϹÝÀûÀÎ ÇÔ¼ö·Î´Â ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ¾ø´Ù. ÈÅ ÇÁ·Î½ÃÀú°¡ Àü´Þ¹ÞÀº Æ÷ÀÎÅͷδ ÀÌ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£À» ¾×¼¼½ºÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. ±×·¡¼­ Àü¿ª ÈÅ ÇÁ·Î½ÃÀú´Â ¹Ýµå½Ã ºÐ¸®µÈ DLL¿¡ ÀÖ¾î¾ß ÇÑ´Ù. DLLÀº °øÀ¯µÇ´Â ¸ðµâÀÌ¸ç ¿¬°áµÈ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡¼­ ½ÇÇàµÇ¹Ç·Î ¸ðµç ½º·¹µåÀÇ ¸Þ½ÃÁö¸¦ ÀÚÀ¯·Ó°Ô ÀÐÀ» ¼ö ÀÖ´Ù. DLL¾È¿¡ ÈÅ ÇÁ·Î½ÃÀú¸¦ ÀÛ¼ºÇØ ³õÀ¸¸é ½Ã½ºÅÛÀÌ ÈÅ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇϱâ Àü¿¡ ÀÌ DLLÀ» ¸Þ½ÃÁö ¸ñÇ¥ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£À¸·Î ¸ÕÀú ·ÎµåÇÑ´Ù.

32ºñÆ® ȯ°æÀÌ º¸È£µÈ ȯ°æÀ̱⠶§¹®¿¡ Àü¿ª ÈÅ ÇÁ·Î½ÃÀú°¡ DLL¿¡ ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀº ¾î·ÆÁö ¾Ê°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ÈÅ ÇÁ·Î½ÃÀú¸¦ DLL·Î ÀÛ¼ºÇÒ ¶§ °ï¶õÇÑ ¹®Á¦°¡ Çϳª ´õ Àִµ¥ ¹Ù·Î °øÀ¯ µ¥ÀÌÅÍÀÇ ¹®Á¦ÀÌ´Ù. DLLÀº ¾îµð±îÁö³ª ¸Þ½ÃÁö¸¦ °¡·Îä±â À§ÇÑ ÈÅ ÇÁ·Î½ÃÀú¸¦ Á¦°øÇÒ »ÓÀÌ¸ç °¡·Îæ ¸Þ½ÃÁö¸¦ ½ÇÁ¦·Î ó¸®ÇÏ´Â ÀÛ¾÷Àº ÈÅ ¼­¹ö°¡ ÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ÈÅ DLLÀº °¡·Îæ ¸Þ½ÃÁö¸¦ ÈÅ ¼­¹ö¿¡°Ô IPC³ª ¸Þ½ÃÁö µîÀÇ ¹æ¹ýÀ¸·Î Àü´ÞÇØ¾ß ÇÏ¸ç ±×·¯±â À§Çؼ­´Â DLLÀÌ ÈÅ ¼­¹öÀÇ ÇÚµéÀ» Ç×»ó °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ ÈÅ Çڵ鵵 Àü¿ªÀ¸·Î À¯ÁöÇØ¾ß ÈÅ ÇÁ·Î½ÃÀúÀÇ ³¡¿¡¼­ CallNextHookEx ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸Þ½ÃÁö°¡ ¿øÈ°ÇÏ°Ô Èê·¯°¡µµ·Ï ÇÒ ¼ö ÀÖ´Ù.

DLLÀº ¿¬°áµÈ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡ ¸ÊÇÎµÇ¸ç °¢ DLL ÀνºÅϽºº°·Î °íÀ¯ÇÑ µ¥ÀÌÅ͸¦ °¡Áø´Ù. DLLÀº ÄÚµå´Â °øÀ¯ÇÏÁö¸¸ µ¥ÀÌÅÍ´Â °øÀ¯ÇÏÁö ¾Êµµ·Ï µÇ¾î ÀÖ´Ù. °á±¹ ÈÅ ¼­¹öÀÇ ÇÚµéÀ̳ª ÈÅ ÇÚµé µî µ¿ÀÛ¿¡ ²À ÇÊ¿äÇÑ Á¤º¸¸¦ °¢°¢ÀÇ DLLÀÌ µû·Î °¡Áö°Ô µÇ¸ç ÀÌ·¸°Ô µÇ¸é ÈÅ DLL°ú ÈÅ ¼­¹ö°¡ Áö¼ÓÀûÀÎ Åë½ÅÀ» ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. °¢ ÇÁ·Î¼¼½º¿¡ ¿¬°áµÈ DLL¸¶´Ù ÈÅ ¼­¹ö¿¡ ´ëÇÑ Á¤º¸³ª ÈÅ ÇÚµéÀÌ ´Þ¶óÁ® ¹ö¸®±â ¶§¹®ÀÌ´Ù.

ÈÅ ÇÁ·Î½ÃÀú°¡ ¾î¶² ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡¼­ ½ÇÇàµÇ°í ÀÖµçÁö °¡·Îæ ¸Þ½ÃÁö¸¦ Àü´ÞÇÒ ÈÅ ¼­¹ö´Â Ç×»ó ÀÏÁ¤ÇØ¾ß ÇÑ´Ù. ±×·¡¼­ ÈÅ DLLÀº °¢°¢ÀÇ ÇÁ·Î¼¼½º¿¡ ¿¬°áµÇ´õ¶óµµ µ¿ÀÛ¿¡ ÇÊ¿äÇÑ Àü¿ª º¯¼ö´Â DLLÀνºÅϽº³¢¸® °øÀ¯ÇØ¾ß ÇÏ¸ç ±×·¯±â À§ÇØ °¢ DLL ÀνºÅϽº³¢¸® IPC·Î Åë½ÅÇϰųª ¶Ç´Â °øÀ¯¼½¼ÇÀ̳ª ÆÄÀϸÊÇÎ, ·¹Áö½ºÆ®¸®°°Àº ¾à¼ÓµÈ Àå¼Ò¿¡ Àü¿ª º¯¼ö¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù.

´ÙÀ½Àº ¼³Ä¡¿Í ÇØÁ¦ÀÇ ¹®Á¦¿¡ ´ëÇØ Á¡°ËÇØ º¸ÀÚ. ÈÅÀ» ¼³Ä¡ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥(ÈÅ ¼­¹ö)Àº ÈÅ ÇÁ·Î½ÃÀú¸¦ °¡Áø DLL(ÈÅ µå¶óÀ̹ö)À» ·ÎµåÇÑ ÈÄ GetProcAddress ÇÔ¼ö·Î ÈÅ ÇÁ·Î½ÃÀúÀÇ ¹øÁö¸¦ Á¶»çÇϰí SetWindowsHookExÇÔ¼ö·Î ÈÅÀ» ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. ÈÅÀ» ÇØÁ¦ÇÒ ¶§´Â UnhookWindowsHookEx ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ ÈÅÀº üÀο¡¼­ Á¦°ÅµÇÁö¸¸ °¢ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£À¸·Î ·ÎµåµÇ¾î ¹ö¸° DLLµéÀº ¸í½ÃÀûÀ¸·Î Á¦°ÅÇÒ ±âȸ¸¦ °¡ÁöÁö ¸øÇÏ°Ô µÈ´Ù.

¶ÇÇÑ Àü¿ª ÈÅÀ» ¼³Ä¡ÇÒ ¶§ SetWindowsHookEx ÇÔ¼ö·Î ÈÅ DLLÀÇ ÇÚµéÀ» Àü´ÞÇØ¾ß Çϴµ¥ ÈÅ ¼­¹ö°¡ ÈÅ DLLÀÇ ÇÚµéÀ» ¾Ë·Á¸é LoadLibrary ÇÔ¼ö·Î DLLÀ» ½ÇÇàÁß¿¡ Àоî¿Í¾ß ÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ÈÅ ¼­¹ö¿Í ÈÅ DLLÀÌ ¹¬½ÃÀûÀ¸·Î ¿¬°áµÉ ¼ö ¾ø´Ù. ±×·¡¼­ Åë»ó Àü¿ª ÈÅÀº DLL ÀÚü¿¡ ¼³Ä¡, ÇØÁ¦ ÇÔ¼ö¸¦ ÀÛ¼ºÇϰí ÈÅ ¼­¹ö´Â DLLÀÇ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¼³Ä¡¿Í ÇØÁ¦ ÀÛ¾÷À» ÇÑ´Ù.

ÀÌ·ÐÀÌ Á¡Á¡ º¹ÀâÇØÁö°í Àִµ¥ ÀÌÂë¿¡¼­ ½ÇÁ¦ ¿¹Á¦¸¦ ¸¸µé¾î º¸°í ºÐ¼®Çϸ鼭 ÀÌ·ÐÀ» Á¤¸®ÇØ º¸µµ·Ï ÇÏÀÚ. ´ÙÀ½ ¿¹Á¦´Â Àü¿ª Űº¸µå ÈÅÀ» ¼³Ä¡ÇÏ¿© Űº¸µå°¡ ´­·¯Áú ¶§¸¶´Ù È¿°úÀ½À» ³½´Ù. Àü¿ª ÈÅÀ̹ǷΠ¸ðµç ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î Àü´ÞµÇ´Â Űº¸µå ¸Þ½ÃÁö¸¦ °¡·Îç ¼ö ÀÖ´Ù. ¸ÕÀú ÈÅ ÇÁ·Î½ÃÀú¸¦ Á¦°øÇÏ´Â DLLºÎÅÍ ÀÛ¼ºÇØ º¸ÀÚ.

 

#include <windows.h>

 

#pragma data_seg(".kbdata")

HINSTANCE hModule=NULL;

HHOOK hKeyHook=NULL;

HWND hWndBeeper=NULL;

#pragma data_seg()

#pragma comment (linker, "/SECTION:.kbdata,RWS")

 

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

{

   if (nCode>=0) {

      SendMessage(hWndBeeper,WM_USER+1,wParam,lParam);

   }

   return CallNextHookEx(hKeyHook,nCode,wParam,lParam);

}

 

extern "C" __declspec(dllexport) void InstallHook(HWND hWnd)

{

   hWndBeeper=hWnd;

   hKeyHook=SetWindowsHookEx(WH_KEYBOARD,KeyHookProc,hModule,NULL);

}

 

extern "C" __declspec(dllexport) void UninstallHook()

{

   UnhookWindowsHookEx(hKeyHook);

}

 

BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpRes)

{

   switch (fdwReason) {

   case DLL_PROCESS_ATTACH:

      hModule=hInst;

      break;

   case DLL_PROCESS_DETACH:

      break;

   }

   return TRUE;

}

 

¼¼ °³ÀÇ Àü¿ª º¯¼ö¸¦ °¡Áö´Âµ¥ ÀÌ º¯¼öµéÀº .kbdata¶ó´Â À̸§ÀÇ ¼½¼Ç¿¡ ¼±¾ðµÇ¾î ÀÖÀ¸¸ç ÀÌ ¼½¼Ç¿¡ °øÀ¯ ¼Ó¼ºÀ» ÁÖ¾ú´Ù. ¼½¼ÇÀ̶õ µ¿ÀÏÇÑ Æ¯¼ºÀ» °¡Áö´Â ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£Àε¥ .data ¼½¼Ç¿¡´Â ÃʱâÈ­µÈ µ¥ÀÌÅ͵éÀÌ ÀúÀåµÇ¸ç .bss ¼½¼Ç¿¡´Â ÃʱâÈ­µÇÁö ¾ÊÀº µ¥ÀÌÅ͵éÀÌ ÀúÀåµÈ´Ù. #pragma data_segÁö½ÃÀÚ´Â ÀÌÈÄ ¼±¾ðµÈ º¯¼ö°¡ ÀúÀåµÉ ¼½¼ÇÀ» ÁöÁ¤Çϴµ¥ º°µµÀÇ ¼½¼ÇÀ» µû·Î ¸¸µé ¼ö ÀÖÀ¸¸ç #pragma comment ¸í·ÉÀ¸·Î ¸µÄ¿¿¡°Ô ÀÌ ¼½¼ÇÀÇ Æ¯¼ºÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. °øÀ¯ ¼½¼ÇÀ» ¸¸µå·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

 

#pragma data_seg("¼½¼Ç¸í")

º¯¼ö ¼±¾ð

#pragma data_seg()

#pragma comment (linker, "/SECTION:¼½¼Ç¸í,RWS")

 

¼½¼Ç À̸§Àº ÀÓÀÇÀÇ ¹®ÀÚ¿­·Î ºÙÀÏ ¼ö ÀÖµÇ ´ë¼Ò¹®ÀÚ´Â ±¸ºÐÇÏÁö ¾ÊÀ¸¸ç 8¹®ÀÚ ÀÌÇÏ·Î ÀÛ¼ºÇØ¾ß ÇÑ´Ù. data_seg Áö½ÃÀÚ·Î ¼½¼Ç À̸§À» ÁÖ¸é ÀÌÈÄ ¼±¾ðµÇ´Â º¯¼öµéÀº ÀÌ ¼½¼Ç¿¡ ÀúÀåµÇ¸ç data_seg Áö½ÃÀÚ¸¸ »ç¿ëÇÏ¸é µðÆúÆ® ¼½¼ÇÀ¸·Î µ¹¾Æ°£´Ù. ±×¸®°í #pargma comment·Î ÀÌ ¼½¼Ç¿¡ ´ëÇØ Àбâ(R), ¾²±â(W), °øÀ¯(S) ¼Ó¼ºÀ» ÁÖµµ·Ï ¸µÄ¿ ¿É¼ÇÀ» ÁÖ¾ú´Ù. °øÀ¯ ¼½¼Ç¿¡ ¼±¾ðµÇ´Â µ¥ÀÌÅÍ´Â ¹Ýµå½Ã ÃʱⰪÀ» °¡Á®¾ß ÇÑ´Ù.

¿¹Á¦¿¡¼­´Â DLLÀÇ ÀνºÅϽº ÇÚµé, ÈÅ ÇÚµé, ±×¸®°í ÈÅ ¼­¹öÀÇ À©µµ¿ì ÇÚµéÀ» °øÀ¯ ¼½¼Ç¿¡ ¼±¾ðÇÏ°í ¸ðµÎ NULL·Î ÃʱâÈ­Çß´Ù. ÀÌ º¯¼öµéÀº °³º° ÇÁ·Î¼¼½º¿Í ¿¬°áµÇ´Â ¸ðµç DLL¿¡ ÀÇÇØ °øÀ¯µÇ¹Ç·Î Çѹø ´ëÀÔµÈ °ªÀº ¾î¶² ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡¼­ ½ÇÇàµÇµç Ç×»ó µ¿ÀÏÇÑ °ªÀ¸·Î ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

DllMain¿¡¼­´Â DLLÀÌ ·ÎµåµÉ ¶§ ÀÚ½ÅÀÇ ÇÚµéÀ» ÀúÀåÇØ µÎ¾ú´Âµ¥ ÀÌ ÇÚµéÀº Àü¿ª ÈÅÀ» ¼³Ä¡ÇÒ ¶§ ÈÅÀ» ¼ÒÀ¯ÇÑ ¸ðµâÀÌ ´©±¸ÀÎÁö¸¦ ÁöÁ¤Çϱâ À§ÇØ »ç¿ëµÈ´Ù. ÈÅ ¼³Ä¡ ÇÔ¼öÀÎ InstallHookÀº Àμö·Î ÈÅ ¼­¹öÀÇ À©µµ¿ì ÇÚµéÀ» Àü´Þ¹Þ¾Æ hWndBeeper Àü¿ª º¯¼ö¿¡ ÀúÀåÇßÀ¸¸ç DLL¿¡ Á¤ÀÇµÈ ÈÅ ÇÁ·Î½ÃÀú KeyHookProc ÇÔ¼ö¸¦ Űº¸µå ¸Þ½ÃÁö¿¡ ´ëÇÑ Àü¿ª ÈÅÀ¸·Î ¼³Ä¡ÇÑ´Ù. ÈÅ ¼­¹ö¿¡¼­ ÀÌ ÇÔ¼ö¸¦ Çѹø¸¸ È£ÃâÇØ ÁÖ¸é ÀÌÈÄ KeyHookProc ÇÔ¼ö´Â ¸ðµç ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î Àü´ÞµÇ´Â Űº¸µå °ü·Ã ¸Þ½ÃÁö¸¦ ¸ÕÀú ¹ÞÀ» ¼ö ÀÖ°Ô µÈ´Ù. UninstallHook ÇÔ¼ö´Â ÈÅÀ» ÇØÁ¦ÇÑ´Ù.

°¡Àå Áß¿äÇÑ KeyHookProc ÇÔ¼ö´Â Űº¸µå ¸Þ½ÃÁö¸¦ Àü´Þ¹Þ¾ÒÀ» ¶§ ÀÌ ¸Þ½ÃÁö¸¦ ÈÅ ¼­¹öÀÎ hWndBeeper¿¡°Ô ±×´ë·Î Àü´ÞÇϴµ¥ À̶§ WM_USER+1 »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö¸¦ »ç¿ëÇß´Ù. Űº¸µå ¸Þ½ÃÁö´Â wParam, lParam¿¡ ¸ðµç ºÎ°¡ Á¤º¸¸¦ ´Ù ½ÇÀ» ¼ö Àֱ⠶§¹®¿¡ ÀÌ·± °£´ÜÇÑ ¹æ¹ýÀ¸·Î ÈÅ ¼­¹ö¿¡°Ô Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ÀÖÁö¸¸ Á» ´õ º¹ÀâÇÑ ¸Þ½ÃÁö¶ó¸é WM_COPYDATA³ª ÆÄÀÏ ¸ÊÇÎ µîÀÇ ´õ º¹ÀâÇÑ IPC ¹æ¹ýÀ¸·Î Åë½ÅÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÈÅ ¼­¹ö¿¡°Ô ¸Þ½ÃÁö¸¦ Àü´ÞÇÑ ÈÄ CallNextHookEx ÇÔ¼ö¸¦ È£ÃâÇÏ¿© üÀÎÀÇ ´ÙÀ½ ÈÅ ÇÔ¼ö¸¦ È£ÃâÇØ ÁÖ¾î °á±¹Àº ¸ñÇ¥ À©µµ¿ì°¡ ÀÌ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ÀÖµµ·Ï Çß´Ù.

KeyHookProcÀº Űº¸µå ¸Þ½ÃÁö¸¦ ÈÅ ¼­¹ö ´ë½Å ¹Þ¾ÆÁÖ´Â Àϸ¸ ÇÒ »ÓÀÌ¸ç °¡·Îæ ¸Þ½ÃÁö¸¦ ½ÇÁ¦·Î »ç¿ëÇÏ´Â ÁÖü´Â ÈÅ ¼­¹öÀÌ´Ù. °á±¹ ÀÌ DLLÀº ¸Þ½ÃÁö¸¦ ¹ÞÀ» ÇÁ·Î¼¼¼­ÀÇ ÁÖ¼Ò °ø°£¿¡ ÀáÀÔÇØ¼­ ÀÌ ÇÁ·Î¼¼¼­·Î Àü´ÞµÇ´Â ¸Þ½ÃÁö¸¦ °¡·Îä ÈÅ ¼­¹ö¿¡°Ô Àü´ÞÇØ ÁÖ´Â Àϸ¸ ÇÏ´Â ½ÉºÎ¸§²Û¿¡ ºÒ°úÇÏ´Ù. ÈÅ ¼­¹ö´Â µ¶¸³µÈ ÇÁ·Î¼¼½ºÀ̱⠶§¹®¿¡ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£À» µé¿©´Ù º¼ ¼ö ¾øÀ¸¸ç ±×·¡¼­ DLLÀ̶ó´Â °£Ã¸À» ¸ðµç ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡ ħÅõ½ÃŰ´Â ¹æ¹ýÀ» ¾´´Ù.

ÀÌ ¿¹Á¦´Â °øÀ¯ µ¥ÀÌÅÍ Ã³¸®¸¦ À§ÇØ °øÀ¯ ¼½¼ÇÀ» »ç¿ëÇߴµ¥ ÆÄÀÏ ¸ÊÇÎÀ¸·Îµµ µ¥ÀÌÅ͸¦ °øÀ¯ÇÒ ¼ö ÀÖ´Ù. ÆÄÀÏ ¸ÊÇÎÀº ÇÁ·Î¼¼½º°£¿¡ °øÀ¯ÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀ̹ǷΠÀÌ ¿µ¿ª¿¡ Àü¿ª º¯¼öµéÀ» ÀúÀåÇÏ¸é °¢ DLL ÀνºÅϽº³¢¸® µ¿ÀÏÇÑ °ªÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦ ¼Ò½º¿¡ ÆÄÀÏ ¸ÊÇÎÀ» »ç¿ëÇÏ´Â Äڵ嵵 ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î Âü°íÇϱ⠹ٶõ´Ù.

´ÙÀ½Àº °¡·Îæ Űº¸µå ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ÈÅ ¼­¹öÀÇ Äڵ带 º¸µµ·Ï ÇÏÀÚ. ÈÅ ¼­¹ö´Â ÈÅ µå¶óÀ̹ö(DLL)¸¦ ÅëÇØ ½Ã½ºÅÛ¿¡ ¹ß»ýÇÑ ¸ðµç ¸Þ½ÃÁö¸¦ Àü´Þ¹Þ´Âµ¥ ÀÌ ½ÃÁ¡¿¡¼­ ¾î¶² ÀÛ¾÷À̵çÁö ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì ÈÅ DLL·ÎºÎÅÍ Àü´ÞµÈ WM_USER+1 ¸Þ½ÃÁö°¡ ÀÛ¾÷À» ÇÒ ½ÃÁ¡ÀÌ´Ù. ÀÚ½ÅÀÌ ¼³Ä¡ÇØ ³õÀº ÈÅ ÇÁ·Î½ÃÀú¸¦ ÅëÇØ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ Å° ÀÔ·Â ½ÃÁ¡À» Á¤È®ÇÏ°Ô Á¦°ø¹Þ´Â °ÍÀÌ´Ù. ´ÙÀ½ ÈÅ ¼­¹ö´Â ¸Þ½ÃÁö ÀÚü¸¦ °Çµå¸®Áö´Â ¾ÊÀ¸¸ç ´­·¯Áø ŰÀÇ Á¾·ù¿¡ µû¶ó ÀûÀýÇÑ È¿°úÀ½À» ³»±â¸¸ ÇÑ´Ù.

 

#include <mmsystem.h>

#include "resource.h"

#include "../KeyBeepDll/KeyBeepDll.h"

TCHAR Mes[]="½Ã½ºÅÛÀÇ Å° ÀÔ·ÂÀ» °¨½ÃÇϸç ۰¡ ´­·¯Áú ¶§¸¶´Ù ¼Ò¸®¸¦ ³À´Ï´Ù.";

TCHAR Mes2[128];

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

   HDC hdc;

   PAINTSTRUCT ps;

   static count;

 

   switch(iMessage) {

   case WM_CREATE:

      InstallHook(hWnd);

      return 0;

   case WM_USER+1:

      wsprintf(Mes2,"ÀÔ·ÂµÈ Å°:%d, lParam : %x ",wParam,lParam);

      InvalidateRect(hWnd,NULL,TRUE);

      if ((lParam & 0x80000000)==0) {

          if (wParam >= 'A' && wParam <= 'Z') {

             PlaySound(MAKEINTRESOURCE(IDR_CHARACTER), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

          if (wParam == ' ') {

             PlaySound(MAKEINTRESOURCE(IDR_SPACE), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

          if (wParam >= '0' && wParam <= '9') {

             PlaySound(MAKEINTRESOURCE(IDR_NUMBER), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

          if (wParam >= VK_F1 && wParam <= VK_F24) {

             PlaySound(MAKEINTRESOURCE(IDR_FUNCTION), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

          if (wParam >= VK_PRIOR && wParam <= VK_HELP) {

             PlaySound(MAKEINTRESOURCE(IDR_EDIT), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

          if (wParam == VK_BACK || wParam == VK_TAB || wParam == VK_RETURN) {

             PlaySound(MAKEINTRESOURCE(IDR_BACKTAB), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

          if ((wParam >= 186 && wParam <= 191) || (wParam >= 219 && wParam <= 222)) {

             PlaySound(MAKEINTRESOURCE(IDR_PUNC), g_hInst, SND_RESOURCE | SND_ASYNC);

          }

      }

      return 0;

   case WM_PAINT:

      hdc=BeginPaint(hWnd, &ps);

      TextOut(hdc,10,10,Mes,lstrlen(Mes));

      TextOut(hdc,10,30,Mes2,lstrlen(Mes2));

      EndPaint(hWnd, &ps);

      return 0;

   case WM_DESTROY:

      UninstallHook();

      PostQuitMessage(0);

      return 0;

   }

   return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

WM_CREATE¿¡¼­ DLLÀÇ ÈÅ ¼³Ä¡ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÀÚ½ÅÀÌ ½ÃÀÛµÉ ¶§ Àü¿ª ÈÅÀ» ¼³Ä¡ÇßÀ¸¸ç WM_DESTROY¿¡¼­ ÈÅÀ» ÇØÁ¦Çϵµ·Ï Çß´Ù. ±×·¡¼­ ÈÅ ¼­¹ö°¡ ½ÇÇàÁßÀÎ µ¿¾È¿¡´Â Àü¿ª ÈÅ ÇÁ·Î½ÃÀú°¡ Áö¼ÓÀûÀ¸·Î ½Ã½ºÅÛÀÇ ¸ðµç Űº¸µå °ü·Ã ¸Þ½ÃÁö¸¦ °¨½ÃÇϸç À̶§¸¶´Ù ÈÅ ¼­¹ö¿¡°Ô ¸Þ½ÃÁö¿Í °ü·ÃµÈ Á¤º¸¸¦ ¾Ë·ÁÁØ´Ù.

°¡·Îæ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ´ëºÎºÐÀÇ ÄÚµå´Â WM_USER+1¿¡ Àִµ¥ È­¸é¿¡ ´­·¯Áø ŰÀÇ Á¤º¸¸¦ ¹®ÀÚ¿­·Î Ãâ·ÂÇØ ÁÖ°í ŰÀÇ ¹üÀ§¿¡ µû¶ó ÀûÀýÇÑ È¿°úÀ½À» ³½´Ù. È¿°úÀ½Àº ªÀº ¿þÀÌºê ÆÄÀÏÀ» »ç¿ëÀÚ Á¤ÀÇ ¸®¼Ò½º·Î ¹Ì¸® ÁغñÇØ µÎ¾úÀ¸¸ç ¿þÀÌºê ÆÄÀÏÀ» ¿¬ÁÖÇÒ ¶§´Â PlaySound¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. Á÷Á¢ ½ÇÇàÇØ º¸¸é ÀÌ ÇÁ·Î¼¼½º°¡ ½ÇÇàÁßÀÎ µ¿¾È¿¡´Â ¸Þ¸ðÀåÀ̳ª ¿öµå ÇÁ·Î¼¼¼­¿¡¼­ ۸¦ ´©¸¦ ¶§¸¶´Ù ŸÀÌÇÁ¸¦ Ä¡´Â µíÇÑ È¿°úÀ½ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.

Æ÷Ä¿½º¸¦ ´©°¡ °¡Áö°í Àֵ簣¿¡ »ç¿ëÀÚ°¡ ۸¦ ´©¸£±â¸¸ Çϸé Űº¸µå ¸Þ½ÃÁö°¡ ¹ß»ýÇϴµ¥ ÀÌ ¸Þ½ÃÁö¸¦ DLLÀÇ ÈÅ ÇÁ·Î½ÃÀú°¡ ¸ÕÀú °¡·Îä¼­ ÈÅ ¼­¹ö¿¡°Ô Àü´ÞÇØ ÁÖ¸ç ÈÅ ¼­¹ö´Â ÀÔ·ÂµÈ Å°ÀÇ Á¾·ù¿¡ µû¶ó ±×·²µíÇÑ »ç¿îµå¸¦ Ãâ·ÂÇϵµ·Ï µÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ÈÅ ¼­¹ö³ª ÈÅ µå¶óÀ̺갡 °¡·Îæ ¸Þ½ÃÁö¸¦ Á¶¿ëÈ÷ ´ÙÀ½ ÈŠüÀÎÀ¸·Î º¸³» ÁֹǷΠ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ µ¿ÀÛÀº ¹æÇØÇÏÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ¸¸¾à KeyHookProc¿¡¼­ CallNextHookEx¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù¸é È¿°úÀ½¸¸ ³ª°í ½ÇÁ¦ Ű ÀÔ·Â ¸Þ½ÃÁö°¡ ¸ñÇ¥ À©µµ¿ì·Î Àü´ÞµÇÁö ¾ÊÀ¸¹Ç·Î ½Ã½ºÅÛÀÇ Å°º¸µå´Â ¸ÔÅëÀÌ µÇ¾î ¹ö¸± °ÍÀÌ´Ù.

¿¹Á¦¸¦ Á÷Á¢ ½ÇÇàÇØ º¸¸é Űº¸µå¸¦ µÎµå¸± ¶§¸¶´Ù ÂûĬ ÂûĬ ¼Ò¸®°¡ ³ª¼­ ¸¶Ä¡ ŸÀڱ⸦ Ä¡´Â µíÇÑ »ö´Ù¸¥ ±âºÐÀÌ µç´Ù. Äڵ带 ª°Ô ¸¸µå´À¶ó ÆíÀÇ ±â´ÉÀº ³ÖÁö ¾Ê¾Ò´Âµ¥ ¸ÞÀÎ À©µµ¿ì¸¦ Á¶±Ý ´õ ¿¹»ÚÀåÇÏ°Ô Àå½ÄÇÏ°í ¿©±â¿¡ È¿°úÀ½À» ¼±ÅÃÇÒ ¼ö ÀÖ´Â ±â´ÉÀ̶óµç°¡ º¼·ý Á¶Àý ±â´É µî¸¸ ³Ö¾îµµ ±ôÂïÇÑ ¾Ç¼¼»ç¸®·Î ¾µ¸¸ÇÑ ÇÁ·Î±×·¥ÀÌ µÈ´Ù.