ÀÌ ¹®¼­¿¡´Â À¯Àú ·¹º§ Áï, Ring 3±ÇÇÑ¿¡¼­ API Hook¸¦ ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇÕ´Ï´Ù.
( Ring 0±ÇÇÑ¿¡¼­ API Hook¸¦ ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­´Â ´ÙÀ½ ¹®¼­¿¡¼­ ¼³¸íÇϰڽÀ´Ï´Ù.
Ȥ½Ã³ª CPU¿¡¼­ Á¦°øÇÏ´Â Ring¿¡ ´ëÇØ¼­ ¸ð¸£½Å´Ù¸é °ü·Ã ¹®¼­¸¦ ¸ÕÀú Àо±â¸¦ ±ÇÇÕ´Ï´Ù. )

API Hook°ú °ü·ÃÇÏ¿© ÀÎÅͳݿ¡¼­ ÀÚ·áµéÀÌ ¸¹ÀÌ ÀÖ´Â °ÍÀÌ »ç½ÇÀÌÁö¸¸ ¼³¸íÀÌ ³Ê¹« ¾î·Æ°Å³ª
°ü·Ã ¼Ò½º°¡ À־ ³Ê¹« ºÒ¾ÈÁ¤ÇÏ°Ô µ¹¾Æ°¡´Â °æ¿ì°¡ ¸¹½À´Ï´Ù. µû¶ó¼­ °£´ÜÇÑ API Hook¸¦ ±¸ÇöÇØº¸°í
½ÇÁ¦·Î »ç¿ëÇÒ ¼ö ÀÖ´Â Hook Äڵ忡 ´ëÇØ¼­ ¼³¸íÇÏ·Á°í ÇÕ´Ï´Ù.

API HookÀ̶õ, Win32 ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëÇÏ´Â API¸¦ ³»°¡ ¸¸µç ÇÁ·Î±×·¥¿¡¼­ °¡·Îæ ÈÄ
°¡·Îæ µ¥ÀÌÅÍÀÇ ³»¿ëÀ» º¸°Å³ª ¶Ç´Â ±× API¸¦ È£ÃâÇÏÁö ¸ø Çϵµ·Ï ÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.
API HookÀ» ÇÏ´Â ¹æ¹ý¿¡´Â ´ÙÀ½°ú Å©°Ô ´ÙÀ½°ú °°ÀÌ µÎ °¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.

1. IAT( ÀÓÆ÷Æ® ¾îµå·¹½º Å×À̺í )
¾ÖÇø®ÄÉÀ̼ǿ¡¼­ Win32 API¸¦ È£ÃâÇϱâ À§Çؼ­´Â API°¡ ½ÇÁ¦·Î ¾î´À À§Ä¡¿¡ ÇØ´çÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ APIÁÖ¼ÒµéÀº IAT¶ó´Â °÷¿¡ ÀúÀåµÇ°Ô µÇ°í ÀÌ Å×À̺íÀÇ °ªÀ» ÅëÇØ¼­ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­´Â API¸¦ È£Ãâ ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.
ÀÌ ¶§ ÀÌ Å×À̺íÀÇ °ªÀ» ¼öÁ¤Çؼ­ ³»°¡ ¿øÇÏ´Â ÁÖ¼Ò·Î Á¡ÇÁÇϵµ·Ï ÇÏ¿© APIÇÔ¼ö¸¦ °¡·Îç ¼ö ÀÖ½À´Ï´Ù.
ÀÌ ¹æ¹ýÀº API HookÁß¿¡¼­ °¡Àå ½¬¿î ¹æ¹ýÀ̳ª IAT¸¦ ÂüÁ¶ÇÏÁö ¾Ê°í API¸¦ È£ÃâÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ Àֱ⠶§¹®¿¡
½ÇÁ¦·Î »ç¿ëÇÏ´Â°Ç ºÒ°¡´ÉÇÕ´Ï´Ù. ´ëÇ¥ÀûÀ¸·Î µ¨ÆÄÀÌ·Î ¸¸µé¾îÁø ÇÁ·Î±×·¥Àº IAT¸¦ »ç¿ëÇÏÁö ¾Ê°í ÀÚüÀûÀ¸·Î
Å×À̺íÀ» °®°í ÀÖ°í ±×·¯ÇÑ Å×À̺íÀ» »ç¿ëÇϱ⠶§¹®¿¡ µ¨ÆÄÀÌ·Î ¸¸µé¾îÁø ¾ÖÇø®ÄÉÀ̼ÇÀº ÈÅÀÌ ºÒ°¡´ÉÇÏ°Ô µË´Ï´Ù.

2. Trampoline Hook ( Æ®·¥Æú¶óÀÎ ÈÅ )
Trampoline HookÀº API ÄÚµå ÀÚü¸¦ º¯°æÇÏ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù.
ÄÚµå ÀÚü¸¦ º¯°æÇÑ´Ù°í ÇØ¼­ ¸¹Àº º¯°æÀÌ ÀϾ´Â °ÍÀº ¾Æ´Ï°í ÀÌÀü ¹®¼­¿¡¼­ Å©·¢¹Ì¸¦ Å©·¢Çß´ø °Í°ú ºñ½ÁÇϰÔ
ÇÔ¼ö¿¡ ½ÃÀÛ ÄÚµå¾Õ¿¡ 5byte Jmp±â°è¾î Äڵ带 »ðÀÔÇÏ¿© ³»°¡ ¸¸µç ÇÔ¼ö·Î Á¡ÇÁÇϵµ·Ï ÇÏ´Â °Í ÀÔ´Ï´Ù.
ÀÌ ¹æ½ÄÀº ¸Å¿ì °­·ÂÇϸç ÇÏÀÌÆÛ ½º³ÀÀ̳ª ½º³×±×ÀÕ °°Àº °æ¿ì¿¡´Â TextOut°è¿­ÀÇ API¸¦ HookÇÏ¿© ÅØ½ºÆ® ĸÃÄ
±â´ÉÀ» °³¹ß ÇÒ ¼ö ÀÖ°í, BitBlt¸¦ HookÇÏ¿© È­¸é ĸÃÄ ¹æÁö ¸ðµâÀ» °³¹ß ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
Áï, »ó¿ë ¾ÖÇø®ÄÉÀ̼ǵµ °£È¤ ¾²ÀÌ¸ç ¿ì¸®°¡ »ç¿ëÇÒ ¹æ¹ýÀº ÀÌ ¹æ½ÄÀ» ÀÌ¿ëÇØ API Hook¸¦ ÇÏ°Ô µÉ °Í ÀÔ´Ï´Ù.

º»·ÐÀ¸·Î µé¾î°¡±âÀü¿¡ Trampoline HookÀÌ ¾î¶°ÇÑ ¹æ½ÄÀÎÁö ÀÌÇØÇϱâ À§ÇØ
Trampoline Hook¸¦ ÀÌ¿ëÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î API¸¦ Hook´ÂÁö »ìÆìº¸°Ú½À´Ï´Ù.
´ë»ó ¾ÖÇø®ÄÉÀ̼ÇÀº ÇÏÀÌÆÛ ½º³ÀÀÌ¸ç ¿ì¼± ÇÏÀÌÆÛ ½º³ÀÀ» ¶ç¿ó´Ï´Ù.
ÀÏ´Ü ÀÌ »óÅ¿¡¼­ TextOutA¿¡ APIÄڵ带 º¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.



( µ¨ÆÄÀÌ IDE¿¡¼­ µð¹ö±ëÇØº¸´Â È­¸éÀÔ´Ï´Ù. VC2005¿¡¼­´Â ÇÔ¼ö¿¡ À̸§ÀÌ ³ª¿ÀÁö ¾Ê±â ¶§¹®¿¡ »ç¿ëÇÏÁö ¾Ê¾Ò½À´Ï´Ù. )
´ÙÀ½°ú °°Àº ÄÚµå·Î ÀÌ·ç¾îÁ® ÀÖ´Ù´Â °ÍÀ» º¸½Ç ¼ö ÀÖÀ¸¸ç ù ºÎºÐÀº mov edi, edi·Î ½ÃÀÛÇÏ°Ô µË´Ï´Ù. ( Windows xp sp2 ±âÁØ. )
±×·¸´Ù¸é TextOutA°¡ ÇÏÀÌÆÛ ½º³À¿¡ ÀÇÇØ ÈÅÀÌ µÇ¾úÀ» °æ¿ì ¾î¶»°Ô ¹Ù²î´Â º¸°Ú½À´Ï´Ù.
( Âü°í : TextOutA°¡ ÈÅÀÌ µÇ´Â ½ÃÁ¡Àº »ç¿ëÀÚ°¡ ÇÏÀÌÆÛ ½º³À¿¡°Ô ÅØ½ºÆ® ĸÃÄ ¸í·ÉÀ» ³»¸° ÈÄ ÈÅÀÌ µÇ°í ¹Ù·Î ÈÅÀÌ ÇØÁ¦ µÇ°Ô µË´Ï´Ù.
¸¸¾à Å×½ºÆ®¸¦ ÇÏ·Á¸é OnPaint ½ÃÁ¡¿¡ TextOutA¸¦ È£ÃâÇϵµ·Ï Çϰí Text From an Object under Cursor¸Þ´º¸¦ ÀÌ¿ëÇØ¾ß ÇÕ´Ï´Ù. )



À§¿Í °°ÀÌ 0xE9 xxxxx ( xx ´Â ³» ÇÔ¼ö°¡ ÀÖ´Â ÁÖ¼Ò. ÀÌ À̹ÌÁö¿¡¼­ ±â°è¾î Äڵ带 º¸½Ã¸é 0xE9´ÙÀ½¿¡ ³ª¿À´Â ÁÖ¼Ò°¡
Á¶±Ý ÀÌ»óÇÏ°Ô º¸ÀÏ ¼ö Àִµ¥ 0xE9¿¡ °æ¿ì´Â »ó´ëÁÖ¼Ò¸¦ »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ¿¡ ´ëÇØ¼­´Â ´ÙÀ½¿¡ ¼³¸íÇÏ°Ô µË´Ï´Ù. )
ÇüÅ·ΠÇÏÀÌÆÛ ½º³ÀÀÌ ¸¸µé¾î ³õÀº ÄÚµå·Î Á¡ÇÁ½Ã۵µ·Ï ÇÕ´Ï´Ù.
ÀÌ ºÎºÐÀº ÇÏÀÌÆÛ ½º³À¿¡¼­ »ç¿ëÇÏ´Â Hook ÇÔ¼ö ÄÚµåÀÔ´Ï´Ù.



¶ÇÇÑ ½ÇÁ¦·Î, ÀÌ ÁÖ¼Ò¿¡ ¸ðµâÀÌ ¿Ã¶ó¿Í ÀÖ´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ( ÁÖ¼Ò´Â ½Ã½ºÅÛ¿¡ µû¶ó¼­ ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù. )




ÇÏÀÌÆÛ½º³À¿¡¼­ »ç¿ëÇÏ´Â Trampoline Hook¿¡ ´ëÇØ¼­ »ìÆìº¸¾Ò´Âµ¥ ÀÌ ¹æ½Ä¿¡ ´ëÇØ¼­ Á¤¸®ÇÏÀÚ¸é ´ÙÀ½°ú °°½À´Ï´Ù.

1. HookingÇÏ·Á´Â ´ë»ó¿¡ APIÀÇ ½ÃÀÛ Äڵ尡 jmpÄÚµå·Î º¯°æµÇ¾ú´Ù. ( 0xE9, 0xXX, 0xXX, 0xXX, 0xXX )
2. ÈÅÅ·ÇÏ·Á´Â ´ë»ó¿¡ ÇÁ·Î¼¼½º¿¡ ƯÁ¤ÇÑ dllÀÌ ·ÎµåµÇ¾ú´Ù. ( À̰ÍÀ» Dll ÀÎÁ§¼ÇÀ̶ó°í ºÎ¸¨´Ï´Ù. )
3. 1¹ø°ú 2¹ø¿¡ ÀÇÇØ¼­ Hooking µÈ API°¡ È£ÃâÀÌ µÇ¸é jmpÄÚµå·Î ÀÎÇØ¼­ ÀÎÁ§¼Ç µÈ dll¿¡ Äڵ尡 ½ÇÇàµÈ´Ù.


API Hooking¿¡ ±âº» È帧À» À§¿¡ 3°¡Áö·Î ¿ä¾àµÉ ¼ö ÀÖ½À´Ï´Ù. ( ¹°·Ð ¿øº» APIÈ£Ãâ±îÁö °í·ÁÇÏÀÚ¸é °³¼ö°¡ Á¶±Ý ´Ã¾î³ª°Ô µË´Ï´Ù. )

±×·¸´Ù¸é ÀÌÁ¦ º»·ÐÀ¸·Î µé¾î°¡¼­ API Hooking¿¡ È帧À» ÆÄ¾ÇÇϱâ À§ÇØ Äڵ带 ÀÛ¼ºÇغ¸°Ú½À´Ï´Ù.
¿©±â¼­ ÇÏ°Ô µÉ ÇÁ·Î±×·¥Àº ÇöÀç ½ÇÇàÁßÀÎ ¸ðµç À©µµ¿ì¿¡¼­ ExtTextOutW API¸¦ HookingÇÏ¿© È£ÃâÀÌ µÇÁö ¾Êµµ·Ï ÇÏ´Â °Í ÀÔ´Ï´Ù.

¿ì¼± API Hooking¿¡ È帧À» ÆÄ¾ÇÇϱâ À§ÇØ Á¦°¡ ¸¸µç Äڵ带 ´Ù¿î·Îµå ¹ÞÀ¸¼¼¿ä.

ExtTextOutW API Hook ¿¹Á¦ ¼Ò½ºÄÚµå


À§¿¡ ÄÚµå´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ºñÁÖ¾ó ½ºÆ©µð¿À 2008·Î ÄÄÆÄÀÏ ÀÛ¼ºµÇ¾úÀ¸¸ç ¸ÞÀÎ ÄÜ¼Ö ÇÁ·Î±×·¥°ú ÀÎÁ§¼Ç¿ë Dll·Î ³ª´©¾îÁý´Ï´Ù.
µû¶ó¼­ ±× ÀÌÇÏ ¹öÀü¿¡¼­´Â ÄÄÆÄÀÏÀÌ ¾ÈµÉ ¼ö ÀÖÀ¸´Ï Æú´õ¿¡ "APIHookExample"´Â ÄÜ¼Ö ÇÁ·Î±×·¥À¸·Î
"APIHookExampleDLL"Àº Dll ÇÁ·Î±×·¥À¸·Î ÇÏ¿© »õ ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇØÁÖ½Ã¸é µË´Ï´Ù.

( ¿©´ãÀÌÁö¸¸ Àú °°Àº °æ¿ì¿¡´Â ¸ÞÀÎUI´Â µ¨ÆÄÀÌ·Î, Dll¿¡ °æ¿ì¿¡´Â C++, C·Î ÀÛ¼ºÇÏ´Â ½ºÅ¸ÀÏÀÌ¶ó¼­ µ¨ÆÄÀÌ ¼Ò½º´Â ¾ø½À´Ï´Ù.
¹°·Ð ¾î·Á¿î ºÎºÐÀÌ ¾ø±â ¶§¹®¿¡ µ¨ÆÄÀÌ »ç¿ëÀÚ¶óµµ ÃæºÐÈ÷ ÄÁ¹öÆÃÀÌ °¡´ÉÇÏ´Ù°í º¾´Ï´Ù.
·çƮŶ °³¹ßÇϽô ºÐµéµµ ÀÌ·± ½ºÅ¸ÀÏ·Î °³¹ßÇϽô ºÐµéÀÌ ¸¹½À´Ï´Ù. ³Ê¹« Çϳª¿¡ ¾ð¾î¸¦ Áß½ÉÀ¸·Î °³¹ßÇÏ´Â °ÍÀº ÁÁÁö ¾ÊÀ¸¸ç
»óȲ¿¡ ¸Â°Ô ÃÖÀûÀÇ ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ¹°·Ð ¿ì¸®³ª¶ó¿¡ ½Ç¹« ȯ°æ¿¡¼­´Â ´Ù C++À̱⠶§¹®¿¡ Èûµé°ÚÁö¸¸... )

¿ì¼± ¹ÞÀº ¼Ò½º¿¡¼­ APIHookExample.cpp¸¦ ¿­¾îº¾´Ï´Ù.
// APIHookExample.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include 

extern "C"
{
	__declspec(dllexport) void InstallHook();
}

extern "C"
{
	__declspec(dllexport) void UninstallHook();
}

int _tmain(int argc, _TCHAR* argv[])
{
	printf("API Hook ¿¹Á¦°¡ ½ÇÇàµÇ¾ú½À´Ï´Ù.\nÁ¾·áÇÏ·Á¸é ¿£Å͸¦ ÀÔ·ÂÇϼ¼¿ä.");

	InstallHook();
	while (TRUE)
	{
		::Sleep(30);
		if (GetKeyState(VK_RETURN) < 0)
		{
			break;
		}
	}

	return 0;
}
	

ÄÜ¼Ö ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î½á InstallHook(), UninstallHook()ÇÔ¼ö¸¦ ÀÓÆ÷Æ®Çϰí ÀÖ½À´Ï´Ù.
¿ì¼± InstallHook()ÇÔ¼ö¸¸ È£ÃâÇϰí ::Sleep() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ±â´Ù¸®´Â ÀÛ¾÷¹Û¿¡ ÇÏÁö ¾Ê½À´Ï´Ù.
( Å×½ºÆ® ÇÁ·Î±×·¥À¸·Î½á UninstallHook()¸¦ È£ÃâÇØÁÖÁö ¾Ê¾Ò½À´Ï´Ù. )
Äڵ尡 ³Ê¹« °£´ÜÇϹǷΠÀÌÁ¦ Dll¿¡ ¼Ò½ºÄڵ带 º¾´Ï´Ù.
APIHookExampleDLL.cppÆÄÀÏÀ» ¿±´Ï´Ù.
// APIHookExampleDLL.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

#include 
#include 

#ifdef _MANAGED
#pragma managed(push, off)
#endif

/////////////////////////////////////////////////////
// ¸ðµç ÇÁ·Î¼¼½º¿¡¼­ °øÀ¯ µÉ º¯¼ö¸¦ ¼±¾ðÇÕ´Ï´Ù.
/////////////////////////////////////////////////////
#pragma data_seg(".APIHookSection")		
HHOOK hHook = NULL;
#pragma data_seg ()

/////////////////////////////////////////////////////
// Àü¿ªÀ¸·Î »ç¿ëÇÒ º¯¼ö¸¦ ¼±¾ðÇÏ¿´½À´Ï´Ù.
HINSTANCE g_hInst = 0;
// API HookÀ» ÇÑ ÈÄ ÈÅÀ» ÇØÁ¦½Ã ¿ø·¡ÀÇ ÄÚµå·Î µÇµ¹¸®±â À§ÇØ
// ¼±¾ðÇÏ¿´½À´Ï´Ù.
BYTE cbOldCode[5] = { 0x00, };
/////////////////////////////////////////////////////

LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);


/////////////////////////////////////////////////////
// ±âº»ÀûÀÎ Àü¿ªÈÅ ·çƾÀÔ´Ï´Ù.
/////////////////////////////////////////////////////
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
	return CallNextHookEx( hHook, nCode, wParam, lParam); 
}

extern "C" __declspec(dllexport) void InstallHook()
{
	hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, g_hInst, 0); 
}

extern "C" __declspec(dllexport) void UninstallHook()
{
	UnhookWindowsHookEx(hHook);
}
/////////////////////////////////////////////////////

BOOL WINAPI MyExtTextOutW( __in HDC hdc, __in int x, __in int y, __in UINT options, __in_opt CONST RECT * lprect, __in_ecount(c) LPCWSTR lpString, __in UINT cbCount, __in_ecount_opt(c) CONST INT * lpDx)
{
	//if (cbCount == 0)
	//{
	//	return FALSE;
	//}
	/*HDC hDC;

	hDC = ::GetDC(0);

	::TextOutA(hDC, 0, 0, "A", 1);
	//::TextOutW(hDC, 0, 0, _T("A"), 1);

	::ReleaseDC(0, hDC);*/

	return TRUE;
}

BOOL InstallAPIHook_ExtTextOutW()
{
	BYTE *pDrawTextWAddress;

	DWORD dwOldProtect;
	DWORD dw;

	pDrawTextWAddress = (BYTE *)GetProcAddress(GetModuleHandle(_T("GDI32.Dll")), "ExtTextOutW");
	if (pDrawTextWAddress == NULL)
	{
		
		::OutputDebugString(_T("ExtTextOutW APIÀÇ ÁÖ¼Ò¸¦ ¾ò¾î¿À´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù."));

		return FALSE;
	}
	VirtualProtect(pDrawTextWAddress, 5, PAGE_WRITECOPY, &dwOldProtect);

	memcpy(cbOldCode, pDrawTextWAddress, 5);

	*pDrawTextWAddress = 0xE9;
	pDrawTextWAddress++; 
	*((DWORD *)(pDrawTextWAddress)) = ((DWORD)MyExtTextOutW) - ((DWORD)pDrawTextWAddress +4);

	VirtualProtect(pDrawTextWAddress, 5, dwOldProtect, &dw);

	return TRUE;
}

BOOL UnInstallAPIHook_ExtTextOutW()
{	
	BYTE *pDrawTextWAddress;

	DWORD dwOldProtect;
	DWORD dw;

	pDrawTextWAddress = (BYTE *)GetProcAddress(GetModuleHandle(_T("GDI32.Dll")), "ExtTextOutW");
	if (pDrawTextWAddress == NULL)
	{
		::OutputDebugString(_T("ExtTextOutW APIÀÇ ÁÖ¼Ò¸¦ ¾ò¾î¿À´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù."));

		return FALSE;
	}
	VirtualProtect(pDrawTextWAddress, 5, PAGE_WRITECOPY, &dwOldProtect);

	memcpy(pDrawTextWAddress, cbOldCode, 5);

	VirtualProtect(pDrawTextWAddress, 5, dwOldProtect, &dw);

	return TRUE;
}


BOOL APIENTRY DllMain( HMODULE hModule,
					  DWORD  ul_reason_for_call,
					  LPVOID lpReserved
					  )
{
	switch(ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		/////////////////////////////////////////////////////
		// DLLÀÌ ÇØ´ç ÇÁ·Î¼¼½º·Î AttachµÇ¾ú½À´Ï´Ù.
		/////////////////////////////////////////////////////
		g_hInst = hModule;

		InstallAPIHook_ExtTextOutW();

		break;

	case DLL_PROCESS_DETACH:
		/////////////////////////////////////////////////////
		// DLLÀÌ ÇØ´ç ÇÁ·Î¼¼½º·Î DetachµÇ¾ú½À´Ï´Ù.
		/////////////////////////////////////////////////////
		UnInstallAPIHook_ExtTextOutW();

		break;
	}

	return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif
	


( ÀÌ ¿¹Á¦Äڵ忡¼­´Â ÄÜ¼Ö ÇÁ·Î±×·¥¿¡¼­ ÀÌ DllÆÄÀÏÀ» ÀÓÆ÷Æ® ÇÔÀ¸·Î DllMainÇÔ¼ö°¡ ½ÇÇàµÇ¾î DLL_PROCESS_ATTACHÀÎÇØ InstallAPIHook_ExtTextOutW()ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á
ÀÚ±âÀڽűîÁöµµ API Hooking¸¦ ÇØ¹ö¸®´Âµ¥ ÀÌ ºÎºÐÀº ¹«½ÃÇϵµ·Ï ÇϰڽÀ´Ï´Ù. )

¼Ò½ºÄڵ带 º¸½Ã¸é »ý°¢Çß´ø°Íº¸´Ù ³Ê¹«³ªµµ API Hooking ¿¹Á¦Äڵ尡 °£´ÜÇÏ´Ù´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
ÇÑ ÆäÀÌÁö¹Ý¹Û¿¡ µÇÁö ¾Ê´Â ¿¹Á¦ ¼Ò½º ÄÚµåÀÔ´Ï´Ù.

±×·¸´Ù¸é ÇϳªÇϳª¾¿ ºÐ¼®Çغ¸µµ·Ï ÇϰڽÀ´Ï´Ù.
¿ì¼± ¸ÞÀÎ ÄÜ¼Ö ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ InstallHookÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µË´Ï´Ù.
ÀÌ ÇÔ¼ö´Â SetWindowsHookEx¸¦ È£ÃâÇϴµ¥ WH_GETMESSAGEÈÅÅ·À» ÇÏ°Ô µË´Ï´Ù.
¿©±â¼­ ¸»¾¸µå¸®°í ½ÍÀº °ÍÀº SetWindowsHookExÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇ¸é
ÈÅÅ·ÇÏ·Á´Â ´ë»ó ÇÁ·Î¼¼½º¿¡ SetWindowsHookEx¸¦ È£ÃâÇÑ Dll¸¦ ½Ã½ºÅÛ¿¡¼­ ÀÚµ¿À¸·Î Dll ÀÎÁ§¼Ç½ÃŲ´Ù´Â °Í ÀÔ´Ï´Ù.


ÀÌ·¸°Ô ÇÔÀ¸·Î½á Dll ÀÎÁ§¼ÇÀ» ½±°Ô ±¸Çö ÇÏ¿´´Âµ¥ »ç½Ç ÀÌ ¹æ¹ý¸»°íµµ CreateRemoteThread API¸¦ ÀÌ¿ëÇÏ¿© ƯÁ¤ ÇÁ·Î¼¼½º¿¡
±ò²ûÇÏ°Ô Dll ÀÎÁ§¼ÇÀ» ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

Dll ÀÎÁ§¼ÇÀÌ µÇ¸é ¹Ù·Î DllMain¿¡¼­ DLL_PROCESS_ATTACH ·çƾÀ» Ÿ°Ô µË´Ï´Ù.
±×¸®°í ÀÌ ·çƾÀº ´Ù½Ã InstallAPIHook_ExtTextOutW()ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µË´Ï´Ù. ÀÌ ºÎºÐÀÌ °¡Àå Áß¿äÇÑ ºÎºÐÀÌ µÇ°Ú½À´Ï´Ù.

GetProcAddress()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© GDI32.Dll¿¡ ÀÖ´Â ExtTextOutWÇÔ¼ö¿¡ ÁÖ¼Ò¸¦ ¾ò¾î¿É´Ï´Ù.
VirtualProtect(pDrawTextWAddress, 5, PAGE_WRITECOPY, &dwOldProtect); ¸¦ ÅëÇØ Copy-On-Write¸¦ ±¸ÇöÇÕ´Ï´Ù.
Copy-On-Write´Â ExtTextOut()ÇÔ¼öÀÇ ½ÃÀۺκп¡¼­ 5Byte¸¸Å­ ±¸ÇöÇϵµ·Ï ÇÏ¿´½À´Ï´Ù.
Áï, ÀÌ 5ByteºÎºÐÀº ¿ì¸®°¡ ¹Ù²ã¾ßÇÒ ±â°è¾î ÄÚµå ¸Þ¸ð¸® ¿µ¿ªÀÎ °Í ÀÔ´Ï´Ù.

Copy-On-Write´Â ¸Å¿ì Áß¿äÇÑ ºÎºÐÀ¸·Î Dll¿¡ °æ¿ì¿¡´Â ¸ðµç ÇÁ·Î¼¼½º°¡ Äڵ带 °øÀ¯ÇÏ°Ô µÇ¹Ç·Î ¸Þ¸ð¸®»ó¿¡
DllÀº ¿ÀÁ÷ Çϳª¸¸ ¿Ã¶ó¿À°Ô µË´Ï´Ù.
±×·¯³ª ºÎµæÀÌÇÏ°Ô Dll¿¡ Äڵ带 ·±Å¸Àӽÿ¡ º¯°æÇØ¾ß ÇÏ´Â °æ¿ì°¡ »ý±â°Ô µÇ´Âµ¥
ÇϳªÀÇ Dll¿¡¼­ ÀÌ Äڵ带 º¯°æÇÏ°Ô µÇ¸é DllÀÌ ¸Þ¸ð¸®»ó¿¡ Çϳª¸¸ ¿Ã¶ó°¡ÀÖÀ¸¹Ç·Î ( ¸ðµç ÇÁ·Î¼¼½º°¡ °øÀ¯ÇϹǷΠ)
¸ðµç ÇÁ·Î¼¼½º°¡ º¯°æ µÈ Äڵ忡 ¿µÇâÀ» ¹Þ°Ô µË´Ï´Ù.
ÀÌ·¯ÇÑ °æ¿ì ƯÁ¤ÇÑ ÇÁ·Î¼¼½º¿¡ ÇÑÇØ¼­ º¯°æ µÈ ÄÚµå ¿µ¿ªÀÌ ´Ù¸¥ ¹°¸® ¸Þ¸ð¸®¸¦ °¡¸£Å°°Ô ÇÔÀ¸·Î½á
´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­´Â ¿µÇâÀ» ¹ÞÁö ¾Ê°í º¯°æÇÑ ÇÁ·Î¼¼½º ÀڽŸ¸ ¿µÇâÀ» ¹Þµµ·Ï ÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ ¹æ¹ýÀº ¿î¿µÃ¼Á¦¿¡¼­ ÆäÀÌ¡ ±â´ÉÀ» ÀÌ¿ëÇÏ¿© Á¦°øÇÏ´Â ¸ÅÄ¿´ÏÁòÀ̸ç ÀÌ¿Í °ü·Ã µÈ ºÎºÐÀº
´Ù¸¥ Ãß°¡ÀûÀÎ ¼­ÀûÀ̳ª ¹®¼­¸¦ Âü°íÇÒ °ÍÀ» ±ÇÀåÇÕ´Ï´Ù.


( ¿©´ãÀÌÁö¸¸ ÀÌ·¯ÇÑ ¿î¿µÃ¼Á¦ ¸ÅÄ¿´ÏÁòÀ» °¡Àå Àß ÀÌÇØÇÏ´Â ¹æ¹ýÀº ¿î¿µÃ¼Á¦ ¼­ÀûÀ» º¸°Å³ª
¿î¿µÃ¼Á¦ ¼Ò½º¸¦ º¸´Â °Íº¸´Ù Á÷Á¢ °£´ÜÇÑ Ä¿³ÎÀ» ±¸ÇöÇÏ¿© ¸ÖƼ ŽºÅ· ¹× ÆäÀÌ¡ ±â´ÉÀ» ¸¸µé¾îº¸´Â°Ô °¡Àå È®½ÇÇÏ°Ô ÀÌÇØ ÇÒ ¼ö ÀÖ½À´Ï´Ù. )

°©ÀÚ±â Copy-On-Write¿¡ ´ëÇØ¼­ ¼³¸íÇÏ´Ùº¸´Ï ³»¿ëÀÌ ¸¹ÀÌ ¾î·Á¿öÁ³´Âµ¥ °è¼Ó ÇØ¼­ ´ÙÀ½ÁÙ¿¡ Äڵ带 ¼³¸íÇϰڽÀ´Ï´Ù.

memcpy(cbOldCode, pDrawTextWAddress, 5); ºÎºÐÀº ¿ì¸®°¡ º¯°æÇØ¾ß ÇÒ ±â°è¾î Äڵ忡 5Byte¸¦ ¹é¾÷µÎ´Â ÄÚµåÀÔ´Ï´Ù.
À̰ÍÀº API Hooking ÇØÁ¦ÇÒ ¶§ ¿ø·¡ÀÇ ÄÚµå·Î µÇµ¹¸®±â À§ÇÔÀÔ´Ï´Ù.

*pDrawTextWAddress = 0xE9; ºÎºÐÀº Jmp±â°è¾î Äڵ带 »ç¿ëÇÑ´Ù´Â ÀǹÌÀÔ´Ï´Ù.

±× ´ÙÀ½¿¡ *((DWORD *)(pDrawTextWAddress)) = ((DWORD)MyExtTextOutW) - ((DWORD)pDrawTextWAddress +4);
±¸¹®Àº Jmp¸¦ ÇØ¾ß ÇÒ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ°Ô µË´Ï´Ù.
¿©±â¼­ ÁÖ¼Ò ÁöÁ¤À» ÇÒ ¶§ º¸½Ã¸é MyExtTextOutW¸¦ ÁöÁ¤Çϴ°ÍÀÌ ¾Æ´Ï¶ó MyExtTextOutWÇÔ¼ö¿¡ ÁÖ¼Ò¿¡¼­
(pDrawTextWAddress +4) ÁÖ¼Ò¸¦ »©ÁÖ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
À̰ÍÀº Jmp¸í·É¾î°¡ Àý´ë ÁÖ¼Ò·Î ÁöÁ¤Çϴ°ÍÀÌ ¾Æ´Ï¶ó »ó´ë ÁÖ¼Ò·Î ÁöÁ¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½ ÁÙÀ» º¸½Ã¸é VirtualProtect(pDrawTextWAddress, 5, dwOldProtect, &dw);¸¦ È£ÃâÇϴµ¥ ¿ø·¡ÀÇ ¸Þ¸ð¸® ¼Ó¼ºÀ¸·Î µÇµ¹¸®°Ô ÇÕ´Ï´Ù.
( ¸Þ¸ð¸® ¼Ó¼ºÀÌÀ̶ó°í ÇÏ´Ï ¸Þ¸ð¸®¿¡ ¼Ó¼ºÀ̶ó´Â °ÍÀÌ Àִ°¡¶ó´Â Àǹ®À» °¡Áú ¼ö Àִµ¥ À̰ÍÀº ÆäÀÌ¡ÀÌ Á¦°øÇÏ´Â ¸Þ¸ð¸® º¸È£±â´ÉÀ» ÀǹÌÇÕ´Ï´Ù. )

ÀÌ ºÎºÐ±îÁö ¿Ï·á°¡ µÇ¾ú´Ù¸é ÀÌÁ¦ºÎÅÍ ExtTextOutWÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇ¸é ¿ì¸®ÀÇ MyExtTextOutWÇÔ¼ö°¡ È£ÃâµÇ°Ô µË´Ï´Ù.

ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº È­¸éÀÌ ¶å´Ï´Ù. ¿©±â¼­ ¿£ÅÍ۸¦ ÀÔ·ÂÇϸé Á¾·áÇÏ°Ô µÇ´Âµ¥ À©µµ¿ìÁî Àü¿ªÀ¸·Î ¿£ÅÍ۸¦ °¨ÁöÇÔÀ¸·Î
´Ù¸¥ ÇÁ·Î±×·¥¿¡¼­ ¿£ÅÍ۸¦ ÀÔ·ÂÇÏ¿©µµ Á¾·áÇÏ°Ô µË´Ï´Ù.



À©µµ¿ìÁî Ž»ö±â¸¦ ¶ç¿öº¸½Ã¸é MyExtTextOutW¿¡¼­ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í return TRUE;¸¦ ÇÔÀ¸·Î ¾î¶°ÇÑ ¹®ÀÚ¿­µµ Ãâ·ÂÀÌ µÇÁö ¾Ê´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.



´ç¿¬È÷ ÆÄÀÌ¾î Æø½º¿¡ °æ¿ì¿¡µµ ¸¶Âù°¡ÁöÀÔ´Ï´Ù.





°£È¤ Ãâ·ÂµÇ´Â ¹®ÀÚ¿­ÀÌ ÀÖÀ» ¼ö Àִµ¥ À̰ÍÀº ´Ù¸¥ TextÃâ·Â APIÇÔ¼ö¸¦ »ç¿ëÇÏ¿©¼­ ±×·¸½À´Ï´Ù.

¹®¼­¿¡ ³»¿ëÀÌ ³Ê¹« ±æ¾îÁ®¼­ 2ºÎ¿¡¼­ ´Ù½Ã ÀÛ¼ºÇϰڽÀ´Ï´Ù.
´ÙÀ½ ¹®¼­¿¡¼­´Â ÀÌ API HookingÇÒ ¶§ÀÇ ¾Ë¾Æ¾ß ÇÒ API±¸Á¶ ¹× ÀÌ ¿¹Á¦ ÇÁ·Î±×·¥¿¡ ¹®Á¦Á¡¿¡ ´ëÇØ¼­ ¼³¸íÇϰڽÀ´Ï´Ù.