¾È³çÇϼ¼¿ä... ¹Î¼º±â ÀÔ´Ï´Ù.
¾îÁ¦´Â Á¦°¡ '¸ö»ì'ÀÌ ³ª¼~ °Á¸¦ ½¬´Â ¸¸ÇàÀ»~~ ^^; µåµð¾î ½ÇÀüÀ̱¸¸¸¿ä~~
*** ½ÇÀü~ ÀÚ, µåµð¾î ±â´Ù¸®°í ±â´Ù¸®´ø ½Ã°£ÀÌ´Ù. ÀÌÁ¦ Á÷Á¢ °¥±¸¸®¸¦ Èֵѷ¯ º¼ ¶§°¡ ¿Ô´Ù. ÀÌ °Á¿¡¼´Â WH_KEYBOARD¿Í WH_SHELLÀ̶ó´Â µÎ °³ÀÇ °¥±¸¸®¸¦ ÀÌ¿ëÇØ Å°º¸µåÀÇ µ¿ÀÛ°ú ³ëÆ®ÆеåÀÇ ½ÇÇàÀ» ¸¶À½²¯ ±«·ÓÇô º¼ °ÍÀÌ´Ù. À§¿¡¼µµ ¼³¸í ÇßÁö¸¸ ½Ã½ºÅÛ Àüü¸¦ »ó´ë·Î ¸Â¯À» ¶ß±â À§Çؼ´Â ÈÅ ÇÁ·Î½ÃÀú°¡ DLL³»¿¡ ÀÖ¾î¾ß ÇÑ´Ù. Ȥ½Ã DLLÀ» ¸¸µéÁÙ ¸ð¸£´Â »ç¶÷ÀÌ ÀÖ´Ù¸é Á¶ ¾Æ·¡ ¿ë±æ´ÔÀÇ ¡®µ¨ÆÄÀÌ·Î DLL ¸¸µé°í »ç¿ëÇϱ⡯¶ó´Â ¸ÚÁø °Á°¡ ÀÖÀ¸´Ï ºü¸¥ ½Ã°£³»¿¡ ÀÐ°í ½ÀµæÇÏ¿© ÀÚ½ÅÀÇ °ÍÀ¸·Î ¸¸µéÀÚ. (¾Æ~ ÀÌ ¾ó¸¶³ª ÈǸ¢ÇÑ ¶°³Ñ±â±â Àΰ¡~ ^^;)
µ¨ÆÄÀÌÀÇ ¡®New¡¯ ¸Þ´º¸¦ ¼±ÅÃÇØ ¡®DLL¡¯ ÇÁ·ÎÁ§Æ®¸¦ Çϳª ½ÃÀÛÇÏ°í, ÇÁ·ÎÁ§Æ® À̸§À» ¡®HookDLL.DPR¡¯·Î ÀúÀåÇÏÀÚ. °¥±¸¸®Áú¿ë ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§Çؼ´Â ¸ÕÀú Uses¹®¿¡ Windows¿Í Messages¸¦ Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù.
uses SysUtils, Classes, Windows, Messages;
Å°º¸µå¿Í ¼¿ÀÇ ÈÅ ÇÚµéÀ» ÀúÀåÇÒ µÎ°³ÀÇ Àü¿ªº¯¼ö¸¦ ¸¸µé¾î µÎÀÚ.
var HKbHook : HHOOK; HShellHook : HHOOK;
¾Õ¿¡¼ ¸»ÇßµíÀÌ, ÀÌ Àü¿ªº¯¼öµéÀº DLL ³»ÀÇ ÈÅ ÇÁ·Î½ÃÀú°¡ È£ÃâµÉ ¶§¸¶´Ù ´Ù¸¥ ¾îÇø®ÄÉÀ̼ÇÀÇ ¿µ¿ª¿¡ Àֱ⠶§¹®¿¡ ¾î¶²°ªÀ» °¡Áö°í ÀÖÀ»Áö´Â ¾Æ¹«µµ ¸ð¸¥´Ù. (¹°·Ð, ÀϹÝÀûÀ¸·Î´Â 0ÀÏ °ÍÀÌ´Ù.) µû¶ó¼ °¢ ¾îÇø®ÄÉÀ̼ǰú ¹«°üÇÑ ¿µ¿ª¿¡ ÀÌ °ªÀ» ÀúÀåÇÏ°í ºÒ·¯¿Í¾ß ÇÑ´Ù. ¿©±â¼´Â ±× ¿µ¿ªÀ» Çϵåµð½ºÅ© ³»ÀÇ ¡®C:\Hook.dat¡¯ÆÄÀÏ·Î ÇÏÀÚ. ÀÌÁ¦ ÀÌ ÆÄÀÏ¿¡ ÆÄÀÏ¿¡ ÈÅ µ¥ÀÌÅ͸¦ ÀÐ°í ½áÁÖ´Â ÇÁ·Î½ÃÀú, ReadData¿Í WriteData¸¦ ¸¸µéÀÚ.
Const HookDataFile = ¡®c:\Hook.Dat¡¯;
procedure ReadData; var F : TFileStream; begin F := TFileStream.Create(HookDataFile, fmOpenRead); try F.Read(HKbHook, sizeof(HKbHook)); F.Read(HShellHook, sizeof(HShellHook)); finally F.Free; end; end;
procedure WriteData; var F : TFileStream; begin F := TFileStream.Create(HookDataFile, fmCreate); try F.Write(HKbHook, sizeof(HKbHook)); F.Write(HShellHook, sizeof(HShellHook)); finally F.Free; end; end;
°¢ ¾îÇø®ÄÉÀ̼ǿ¡¼ ÀÌ DLLÀÌ È£ÃâµÉ ¶§, ÀϹÝÀûÀ¸·Î À§ÀÇ Àü¿ªº¯¼ö °ªÀº 0ÀÌ´Ù. ±×·¯³ª ´©°¡ ¾Ë°Ú´Â°¡~?? ºÒÀÇÀÇ »ç°í·Î ÀÎÇØ 0ÀÌ ¾Æ´Ñ ¾²·¹±â°ªÀÌ µé¾î°¥ ¼öµµ ÀÖ´Ù. ¿µÈ¿¡¼µµ º¸¸é ±×·¸´Ù. ´Ù Á×ÀºÁÙ ¾Ë¾Ò´ø ÁÖÀΰøÀÌ ¡®²ôÀÀ~¡¯ÇÏ°í »ì¾Æ³ª ¿µÈ ³¡³¯¶§±îÁö ¾Ç´çÀ» ±«·ÓÈù´Ù. ÀÌ ¾Ç´ç~ ÀڱⰡ °ÔÀ»·¯¼ ±×·¸°Ô µÈ °ÍÀ̹ǷΠ¾îµð°¡¼ Çϼҿ¬µµ ÇÏÁö ¸øÇÑ´Ù. µû¶ó¼ ¿ì¸® ¿ª½Ã ºÒ½ÖÇÑ ¾Ç´ç²ÃÀÌ µÇÁö ¾Ê±â À§Çؼ´Â ¾ðÁ¦³ª ¡®È®Àλç»ì¡¯À» È®½ÇÈ÷ ÇØ¾ß ÇÑ´Ù. Ãʱ⿡ µÎ°³ÀÇ ÈÅÇÚµé Àü¿ªº¯¼ö¸¦ 0À¸·Î ÇØ ÁÖÀÚ.
begin HKbHook := 0; HShellHook := 0; end.
ÀÌÁ¦ Å°º¸µå µ¿ÀÛ¿¡ ´ëÇÑ °¥±¸¸®ÁúÀ» Á¤ÀÇÇÏÀÚ. Å°º¸µå¸¦ ¸ÔÅëÀ¸·Î ¸¸µé¾î, Å°º¸µå À§¿¡ ¶ó¸é³²ºñ¸¦ ¿Ã·Á³õ°í ¶ó¸éÀ» ¸Ô´Â °ÍÀÌ ÀÌ °¥±¸¸®ÁúÀÇ ¸ñÀûÀÌ´Ù.
{ °¥±¸¸®Áú ÇÁ·Î½ÃÀú } function MyKBHook(Code : Integer; wParam : WPARAM; lParam : LPARAM) : LongInt; stdcall; begin { ÆÄÀÏ¿¡ ÀúÀåµÈ ÈÅÇÚµéÀ» Àоî¿Â´Ù. } if HKbHook = 0 then ReadData; { Code°ªÀÌ 0º¸´Ù Å©°Å³ª °°À»¶§¸¸ } { °¥±¸¸®ÁúÀ» ÇÏ´Â °ÍÀÌ ¿ä·É. } if Code >= 0 then begin { Å°º¸µå¸¦ ¸ù¶¥ ¾È´¸®°Ô ÇÏÀÚ. } { ´ÙÀ½ ÈÅüÀÎÀÌ ºÒ¸®Áö ¾Êµµ·Ï ÇÏ¸é ³¡~! } Result := Integer(True); Exit; end; Result := CallNextHookEx(HKbHook, Code, wParam, lParam); end;
{ Å°º¸µå °¥±¸¸® Âï±â } function HookKB : Boolean; begin HKbHook := SetWindowsHookEx( WH_KEYBOARD, MyKBHook, HInstance, 0); Result := Boolean(HKbHook); { ÆÄÀÏ¿¡ ÈÅÇÚµé ¾²±â } WriteData; end;
{ Å°º¸µå °¥±¸¸® »Ì±â } function UnHookKB : Boolean; begin { ÆÄÀÏ¿¡ ÀúÀåµÈ ÈÅÇÚµéÀ» Àоî¿Â´Ù. } if HKbHook = 0 then ReadData; Result := UnhookWindowsHookEx(HKbHook); end;
°¥±¸¸®¸¦ Âï°í »Ì´Â ¹æ¹ý, ±×¸®°í °¥±¸¸®¸¦ Èֵθ£´Â ¹æ¹ý¿¡ ´ëÇÑ °³³äÀÌ ¾î·ÆÁö ¾Ê°Ô ÀÌÇØ µÇ¾úÀ» °ÍÀÌ´Ù. À̹ø¿£ ¸¶Âù°¡Áö ¹æ¹ýÀ¸·Î ¡®¸Þ¸ðÀ塯ÀÇ ½ÇÇàÀ» ¸ð´ÏÅÍÇÏ´Â °¥±¸¸®¸¦ Çϳª ´õ ¸¸µé¾î º¸ÀÚ.
{ ¼¿ °¥±¸¸®Áú } function MyShellHook(Code : Integer; wParam : WPARAM; lParam : LPARAM) : LongInt; stdcall; var Buff : array [0..255] of Char; s : String; begin { ÆÄÀÏ¿¡ ÀúÀåµÈ ÈÅÇÚµéÀ» Àоî¿Â´Ù. } if HShellHook = 0 then ReadData; { À©µµ¿ìÀÇ »ý¼º°ú ¼Ò¸ê¸¸ ±«·ÓÈù´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº µµ¿ò¸»À» ÂüÁ¶ÇÒ °Í. } if (code = HSHELL_WINDOWCREATED) or (code = HSHELL_WINDOWDESTROYED) then begin { À©µµ¿ìÀÇ Å¬·¡½º¸íÀ» Àоî¿Â´Ù. Code°ªÀÌ À§ÀÇ µÎ°³ÀÇ °ªÀÏ °æ¿ì, wParamÀº À©µµ¿ìÀÇ Çڵ鰪ÀÌ µÈ´Ù. } GetClassName(wParam, Buff, SizeOf(Buff)); { Ŭ·¡½º¸íÀÌ ³ëÆ®Æеå¶ó¸é ¸Þ½ÃÁö¹Ú½º º¸¿©ÁÖ±â. } if Buff = 'Notepad' then begin if (code = HSHELL_WINDOWCREATED) then S := '¸Þ¸ðÀåÀÌ ½ÇÇàµÇ´Â±¸¸¸¿ä~!' else S := '¸Þ¸ðÀåÀÌ ³¡³µ±¸¸¸¿ä~!'; MessageBox(0,PChar(S),'Hook Message',0); end; end; { ´ÙÀ½ ÈÅüÀΠȣÃâ } Result := CallNextHookEx(HShellHook, Code, wParam, lParam); end;
{ ¼¿ °¥±¸¸® Âï±â } function HookSHELL : Boolean; begin HShellHook := SetWindowsHookEx( WH_SHELL, MyShellHook, HInstance, 0); Result := Boolean(HShellHook); { ÆÄÀÏ¿¡ ÈÅÇÚµé ¾²±â } WriteData; end;
{ ¼¿ °¥±¸¸® »Ì±â } function UnHookSHELL : Boolean; begin { ÆÄÀÏ¿¡ ÀúÀåµÈ ÈÅÇÚµéÀ» Àоî¿Â´Ù. } if HShellHook = 0 then ReadData; Result := UnhookWindowsHookEx(HShellHook); end;
ÀÌÁ¦, °¥±¸¸®¸¦ Âï°í »Ì´Â ÇÔ¼öµéÀ» ¿ÜºÎ¿¡¼ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Exports ±¸¹®¿¡ Ãß°¡ÇØ ÁÖÀÚ.
Exports HookKB, HookSHELL, UnHookKB, UnHookSHELL;
ÀÌ°ÍÀ¸·Î ÈÅ¿ë DLLÀÌ ¿Ï¼ºµÇ¾ú´Ù. ÄÄÆÄÀÏ ÇÏ¸é ¡®Hookdll.DLL¡¯ ÆÄÀÏÀÌ »ý±æ °ÍÀÌ´Ù. ÀÌÁ¦ ÀÌ DLLÀ» »ç¿ëÇØ °¥±¸¸®¸¦ Âï°í ÇØÁ¦ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ. »õ·Î¿î ¾îÇø®ÄÉÀ̼ÇÀ» ½ÃÀÛÇÏ°í Hookdll.DLL¡¯³»ÀÇ ÇÔ¼öµéÀ» ´ÙÀ½°ú °°ÀÌ ÀÓÆ÷Æ® ÇÑ´Ù.
function HookKB : Boolean; external 'HookDll.dll'; function UnHookKB : Boolean; external 'HookDll.dll'; function HookSHELL : Boolean; external 'HookDll.dll'; function UnHookSHELL : Boolean; external 'HookDll.dll';
¹öÆ°À» ³× °³ ¿Ã·Á³õ°í À̸§À» °¢°¢ HookKBBtn, HookShellBtn, UnHookKBBtn, UnHookShellBtn À̶ó°í ÁþÀÚ. ¾ÕÀÇ µÎ ¹öÆ°ÀÇ Enabled ¼Ó¼ºÀ» ²¨ÁÖ°í °¢ ¹öÆ°µéÀÇ OnClickÀ̺¥Æ® ÇÁ·Î½ÃÀú¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇØ ÁØ´Ù.
procedure TForm1.HookKBBtnClick(Sender: TObject); begin if HookKB then begin HookKBBtn.Enabled := false; UnHookKBBtn.Enabled := True; end; end;
procedure TForm1.HookShellBtnClick(Sender: TObject); begin if HookShell then begin HookShellBtn.Enabled := false; UnHookShellBtn.Enabled := True; end; end;
procedure TForm1.UnHookKBBtnClick(Sender: TObject); begin if UnHookKB then begin HookKBBtn.Enabled := True; UnHookKBBtn.Enabled := False; end; end;
procedure TForm1.UnHookShellBtnClick(Sender: TObject); begin if UnHookShell then begin HookShellBtn.Enabled := True; UnHookShellBtn.Enabled := False; end; end;
ÀÌÁ¦ ÄÄÆÄÀÏ ÈÄ ½ÇÇàÇØ º¸ÀÚ. Å°º¸µå ÈÅÀ» µ¿ÀÛ½ÃÅ°¸é Å°º¸µå À§¿¡ ¶ó¸é³¿ºñ¸¦ ¿Ã·Á³õ°í ¸ÔÀ» ¼ö ÀÖ´Ù. ¼¿ ÈÅÀ» µ¿ÀÛ½ÃŲ´Ù¸é ¡®¸Þ¸ðÀ塯ÀÌ ½ÇÇàµÇ°í ³¡³¯ ¶§¸¶´Ù ¸Þ½ÃÁö¹Ú½º°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù. ´«Ä¡ ºü¸¥ »ç¶÷Àº Å°º¸µå ÈÅÀ¸·Î Å°º¸µå Àüü¸¦ ¸ÔÅëÀ¸·Î ¸¸µé¾îµµ Alt-Tab À̳ª Ctrl-Alt-Del °°Àº Å°Á¶ÇÕÀÌ ¸·È÷Áö ¾Ê´Â´Ù´Â °ÍÀ» ¹ß°ßÇßÀ» °ÍÀÌ´Ù. À©µµ¿ì´Â ÀÌ·¯ÇÑ ½Ã½ºÅÛ Å°Á¶ÇÕÀ» °¥±¸¸®Áú·ÎºÎÅÍ º¸È£ÇÏ°í Àֱ⠶§¹®Àε¥, ÀÌ°ÍÁ¶Â÷ ¸·¾Æ¹ö¸®±â Èñ¸ÁÇÏ´Â ¿±±âÀû ÇÁ·Î±×·¡¸Ó´Â ÆÁ °Ô½ÃÆÇ¿¡ ¿Ã¶ó¿Í ÀÖ´Â ¿µÀç´ÔÀÇ ±ÛÀ» Âü°í·Î ÇÏÀÚ.
*** ¸ÎÀ¸¸ç~ ¸Þ¸ðÀåÀÇ ½ÇÇàÀ» ¸ð´ÏÅÍÇÏ°í Å°º¸µå¸¦ ¸ÔÅëÀ¸·Î ¸¸µå´Â °£´ÜÇÑ °¥±¸¸® ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¾Ò´Ù. °¥±¸¸®¸¦ ¾´´Ù´Â °ÍÀº °ÍÀº ¸Þ½ÃÁö È帧À» ¼Õ¿¡ Áã´Â °ÍÀÌ´Ù. ÀÌÁ¦ Á¶±ÝÀÌ¶óµµ ²¬¶±´ë´Â ¸Þ½ÃÁö°¡ ´«¿¡ ¶è´Ù¸é Àâ¾Æ¼ Á·Ä¡°í º¼ °ÍÀÌ´Ù. ¼ö Ʋ¸®¸é À§ÀÇ Å°º¸µå ÈÅó·³ Àü´ÞÇÏÁö ¾Ê°í »ðÀ¸·Î ¹¯¾î¹ö¸®´Â Àϵµ Á¾Á¾ ¹ß»ýÇÒ °ÍÀÌ´Ù.
±×·¯´Ï ºÎµð ¸Ó¸®µµ ÀÚÁÖ °¨°í ¹ßµµ ÀÚÁÖ ´Û¾Æ °³ÀÎ À§»ý ¹× Á¤½Å°Ç°À» ¹Ù·ÎÀâ°í ¸ÇÁ¤½ÅÀ¸·Î ´Ù°¡¿À´Â 21¼¼±â¸¦
|