µû¶óÇØº¸´Â ÈÄÅ·
ÀÛ¼ºÀÚ : ÀÌÀº±Ô
ÀÛ¼ºÀÏ : 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
}
ÀÚ ÀÌÁ¦ ½ÇÇàÇϸé Űº¸µå¸¦ Ä¥ ¶§¸¶´Ù Ä«¿îÆ®°¡ Áõ°¡ÇÏ´Â ÇÁ·Î±×·¥ÀÌ ¿Ï¼ºÀÌ µÇ¾ú´Ù.