¸ñÂ÷

ÄÚµåÇÁ·ÎÁ§Æ®¿¡´Â ÀÌ¹Ì ¸î °³ÀÇ ÆÐ½º¿öµå ½ºÆÄÀÌ Æ©Å͸®¾óÀÌ ¿Ã¶ó¿Í ÀÖÁö¸¸ À̵éÀº ¸ðµÎ À©µµ¿ìÁî ÈÅ¿¡ ÀÇÁ¸Çϰí ÀÖ´Ù. ÀÌ·±
À¯Æ¿¸®Æ¼¸¦ ¸¸µå´Â ´Ù¸¥ ¹æ¹ýÀº ¾øÀ»±î? ¹æ¹ýÀÌ ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ ÆäÀÌÁö¿¡¼ ¸ðµç ³»¿ëµéÀ» ¸íÈ®È÷ Çϱâ À§ÇØ ¸ÕÀú ¹®Á¦Á¡µéÀ» ¸®ºä
ÇØº¸±â·Î ÇÑ´Ù.
¿ì¸®ÀÇ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ¼ÓÇ졂 ¾È ¼ÓÇ졂 ¾î¶² ÄÁÆ®·ÑÀÇ ³»¿ëµéÀ» "Àбâ" À§Çؼ ÀϹÝÀûÀ¸·Î ÀÌ ÄÁÆ®·Ñ¿¡ WM_GETTEXT
¸Þ½ÃÁö¸¦ Àü¼ÛÇÑ´Ù. À̰ÍÀº ÇϳªÀÇ Æ¯º°ÇÑ case¸¦ Á¦¿ÜÇÑ´Ù¸é ¿¡µðÆ® ÄÁÆ®·Ñ¿¡µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù. ¿¡µðÆ® ÄÁÆ®·ÑÀÌ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡
¼ÓÇϰí
ES_PASSWORD ½ºÅ¸ÀÏÀÌ ¼³Á¤µÇ¾î ÀÖ´Ù¸é ÀÌ·¯ÇÑ Á¢±Ù¹ýÀº ½ÇÆÐÇÑ´Ù. ÆÐ½º¿öµå ÄÁÆ®·ÑÀ» "¼ÒÀ¯ÇÏ´Â"
ÇÁ·Î¼¼½º¸¸ÀÌ
WM_GETTEXT¸¦ °æÀ¯ÇÏ¿© ±× ³»¿ëÀ» ¾òÀ» ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ¿ì¸®ÀÇ ¹®Á¦Á¡Àº ¾Æ·¡¿Í °°Àº Á¡À¸·Î
¾ÐÃàµÈ´Ù. Áï ¾î¶»°Ô Çϸé
::SendMessage( hPwdEdit, WM_GETTEXT, nMaxChars, psBuffer );
¸¦ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£ ³»¿¡¼ ½ÇÇà½Ãų ¼ö Àִ°¡ ÇÏ´Â Á¡À¸·Î ¾ÐÃàµÈ´Ù.
ÀϹÝÀûÀ¸·Î ÀÌ ¹®Á¦¸¦ Ǫ´Â ¹æ¹ý¿¡´Â 3°¡ÁöÀÇ °¡´É¼ºÀÌ ÀÖ´Ù.
- ¿ì¸®ÀÇ Äڵ带 DLL¿¡ ³ÖÀº ÈÄ ÀÌ DLLÀ» windows
hooks¸¦ ÀÌ¿ëÇÏ¿© ¿ø°Ý ÇÁ·Î¼¼½º¿¡ map ÇÑ´Ù.
- ¿ì¸®ÀÇ Äڵ带 DLL¿¡ ³Ö°í ÀÌ DLLÀ» CreateRemoteThread¿Í LoadLibrary
Å×Å©´ÐÀ» ÀÌ¿ëÇÏ¿© ¿ø°Ý ÇÁ·Î¼¼½º¿¡ map ÇÑ´Ù.
- µ¶¸³ÀûÀÎ DLLÀ» ÀÛ¼ºÇÏ´Â ´ë½Å
WriteProcessMemory¸¦
°æÀ¯ÇÏ¿© ¿ì¸®ÀÇ Äڵ带 ¿ø°Ý ÇÁ·Î¼¼½º¿¡ Á÷Á¢ º¹»çÇÑ ÈÄ CreateRemoteThread¸¦ ÀÌ¿ëÇÏ¿© À̰ÍÀ»
½ÇÇàÇÑ´Ù. ÀÌ Å×Å©´Ð¿¡ °üÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº
¿©±â¿¡¼
¹ß°ßÇÒ ¼ö ÀÖ´Ù.
I. À©µµ¿ìÁî ÈÅ
µ¥¸ð ÀÀ¿ëÇÁ·Î±×·¥ : HookSpy ¿Í HookInjEx
À©µµ¿ìÁî ÈÅÀÇ ±âº»ÀûÀÎ ¿ªÇÒÀº ¸î¸î ¾²·¹µåÀÇ ¸Þ½ÃÁö Æ®·¡ÇÈÀ» ¸ð´ÏÅÍ ÇÏ´Â °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î ¾Æ·¡¿Í °°Àº °ÍÀÌ ÀÖ´Ù.
- ·ÎÄà ÈÅ : À̰ÍÀ¸·Î´Â ¿ì¸®ÀÇ ÇÁ·Î¼¼½º¿¡ ¼ÓÇÏ´Â ¸ðµç ¾²·¹µåÀÇ ¸Þ½ÃÁö Æ®·¡ÇÈÀ» ¸ð´ÏÅÍ ÇÑ´Ù.
- ¸®¸ðÆ® ÈÅ : ¾Æ·¡ Áß Çϳª°¡ µÉ ¼ö ÀÖ´Ù.
- thread-specific : ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ¼ÓÇÏ´Â ¾²·¹µåÀÇ ¸Þ½ÃÁö Æ®·¡ÇÈÀ» ¸ð´ÏÅÍ Çϱâ À§ÇØ.
- system-wide
: ½Ã½ºÅÛ¿¡¼ ÇöÀç ½ÇÇàµÇ°í ÀÖ´Â ¸ðµç ¾²·¹µåµéÀÇ ¸Þ½ÃÁö Æ®·¡ÇÈÀ» ¸ð´ÏÅÍ Çϱâ À§ÇØ.
ÈÅÀÌ µÉ ¾²·¹µå°¡ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ¼ÓÇÑ´Ù¸é(À§ÀÇ case 2a¿Í 2b) ¿ì¸®ÀÇ ÈÅ ÇÁ·Î½ÃÀú´Â µ¿Àû ¸µÅ© ¶óÀ̺귯¸®(DLL)¿¡
Á¸ÀçÇØ¾ß ÇÑ´Ù. ±×·¯¸é ½Ã½ºÅÛÀÌ ÈÅ ÇÁ·Î½ÃÀú¸¦ Æ÷ÇÔÇÏ´Â DLLÀ» ÈÅÀÌ µÇ´Â ¾²·¹µåÀÇ ÁÖ¼Ò °ø°£À¸·Î map ÇÑ´Ù. À©µµ¿ìÁî´Â ÈÅ
ÇÁ·Î½ÃÀú¸¸ÀÌ ¾Æ´Ï¶ó Àüü DLLÀ» map ÇÑ´Ù. À©µµ¿ìÁî ÈÅÀÌ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡ Äڵ带 ÁÖÀÔÇϱâ À§ÇØ ÀÌ¿ëµÉ ¼ö ÀÖ´Â
ÀÌÀ¯µµ ÀÌ ¶§¹®ÀÌ´Ù.
ÀÌ ¹®¼¿¡¼ ÇÊÀÚ´Â ´õ ÀÌ»ó ÈÅ¿¡ ´ëÇØ ¾ð±ÞÇÏ°í ½ÍÁö ¾ÊÁö¸¸(ÀÚ¼¼ÇÑ °ÍÀº MSDN¿¡¼
SetWindowHookEx API¸¦ ÂüÁ¶Çϱ⠹ٶ÷) ´Ù¸¥ ¹®¼¿¡¼ ¹ß°ßÇϱâ ÈûµéÁö¸¸ ¸Å¿ì À¯¿ëÇÑ 2°³ÀÇ
ÈùÆ®¸¦ Á¦°øÇØÁÖ°Ú´Ù.
-
SetWindowsHookEx¿¡ ´ëÇÑ ¼º°øÀûÀΠȣÃâ ÈÄ ½Ã½ºÅÛÀº DLLÀ» ÈÅÀÌ µÈ ¾²·¹µåÀÇ ÁÖ¼Ò
°ø°£À¸·Î ÀÚµ¿À¸·Î map ÇÏÁö¸¸ ¹Ýµå½Ã ¹Ù·Î map ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. À©µµ¿ìÁî ÈÅÀº ¸ðµÎ ¸Þ½ÃÁö¿Í °ü·ÃµÇ¹Ç·Î DLLÀº ÀûÀýÇÑ
À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§±îÁö´Â »ç½Ç »ó map µÇÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¸é
¿©·¯ºÐÀÌ Æ¯Á¤ ¾²·¹µåÀÇ ¸ðµç nonqueued ¸Þ½ÃÁöµé(WH_CALLWNDPROC)À» ¸ð´ÏÅÍ
ÇÏ´Â ÈÅÀ» ¼³Ä¡Çß´Ù¸é ¸Þ½ÃÁö°¡ (ƯÁ¤ À©µµ¿ìÀÇ) ÈÅÀÌ µÇ´Â ¾²·¹µå¿¡ ½ÇÁ¦·Î Àü¼ÛµÉ ¶§±îÁö ÀÌ DLLÀº ¿ø°Ý ÇÁ·Î¼¼½º¿¡
map µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ ¸Þ½ÃÁö°¡ ÈÅÀÌ µÉ ¾²·¹µå¿¡ Àü¼ÛµÇ±â Àü¿¡
UnhookWindowsHookEx°¡ È£ÃâµÈ´Ù¸é DLLÀº °áÄÚ ¿ø°Ý ÇÁ·Î¼¼½º¿¡ map µÇÁö ¾ÊÀ»
°ÍÀÌ´Ù(SetWindowsHookEx¿¡ ´ëÇÑ È£Ãâ ÀÚü°¡ ¼º°øÇßÀ»Áö¶óµµ). ¹Ù·Î mappingÀÌ
µÇµµ·Ï ÇÏ·Á¸é
SetWindowsHookEx¿¡ ´ëÇÑ È£Ãâ Á÷ÈÄ¿¡ °ü·ÃµÈ ¾²·¹µå¿¡ ÀûÀýÇÑ À̺¥Æ®¸¦ Àü¼ÛÇÑ´Ù.
UnhookWindowsHookEx È£Ãâ ÈÄÀÇ DLLÀÇ unmapping¿¡ ´ëÇÑ °Íµµ µ¿ÀÏÇÏ´Ù. ÀûÀýÇÑ
À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§±îÁö DLLÀº »ç½Ç »ó unmap µÇÁö ¾Ê´Â´Ù.
- ÈÅÀ» ¼³Ä¡ÇÒ ¶§ À̵éÀº ½Ã½ºÅÛ ÀüüÀÇ performance¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù(ƯÈ÷ system-wide ÈÅÀÇ °æ¿ì).
ÇÏÁö¸¸ ÀÌ·± ´ÜÁ¡Àº ¸Þ½ÃÁö trap ÀåÄ¡·Î¼°¡ ¾Æ´Ï¶ó DLL mapping ¸ÞÄ¿´ÏÁò ¸ñÀûÀ¸·Î¸¸ thread-specific ÈÅÀ»
ÀÌ¿ëÇÑ´Ù¸é ½±°Ô ±Øº¹ÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ ÄÚµå Á¶°¢À» Âü°íÇ϶ó.
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
if( ul_reason_for_call == DLL_PROCESS_ATTACH )
{
char lib_name[MAX_PATH];
::GetModuleFileName( hModule, lib_name, MAX_PATH );
::LoadLibrary( lib_name );
::UnhookWindowsHookEx( g_hHook );
}
return TRUE;
}
±×·±µ¥ ¹«½¼ ÀÏÀÌ ÀϾÀ»±î? ¸ÕÀú ¿ì¸®´Â À©µµ¿ìÁî ÈÅÀ» °æÀ¯ÇÏ¿© ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ´ëÇØ DLLÀ» map Çß´Ù. ±×·± ÈÄ ÀÌ
DLLÀÌ ½ÇÁ¦·Î mapÀÌ µÈ Á÷ÈÄ¿¡ ¿ì¸®´Â À̰ÍÀ» ´Ù½Ã unhook ÇÑ´Ù. Á¤»óÀûÀ¸·Î´Â ÈÅÀÌ µÈ ¾²·¹µå¿¡ ù ¹øÂ° ¸Þ½ÃÁö°¡
µµ´ÞÇÏ´Â ¼ø°£ ÀÌ DLLµµ ¿ª½Ã unmap µÉ °ÍÀÌ´Ù. Æ®¸¯À¸·Î¼ ¿ì¸®´Â
LoadLibrary¸¦ ÅëÇØ DLLÀÇ ÂüÁ¶ Ä«¿îÆ®¸¦ Áõ°¡½ÃÅ´À¸·Î½á ÀÌ ummappingÀ» ¹æÁöÇÑ´Ù.
³²Àº Àǹ®Á¡Àº ÇÒ ÀÏÀ» ´Ù ¸¶Ä£ ÈÄ ÀÌ DLLÀ» ¾î¶»°Ô unload Çϴ°¡ ÇÏ´Â Á¡ÀÌ´Ù. ¿ì¸®´Â ÀÌ¹Ì ¾²·¹µå¸¦ unhook
ÇßÀ¸¹Ç·Î UnhookWindowsHookEx´Â ÀÌ·± ÀÛ¾÷À» ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ ¹®Á¦´Â ¾Æ·¡¿Í °°ÀÌ
ÇÔÀ¸·Î½á ÇØ°áÇÒ ¼ö ÀÖ´Ù.
- DLLÀ» unmap ÇÏ·Á°í Çϱâ Á÷Àü¿¡ ´Ù¸¥ ÈÅÀ» ¼³Ä¡ÇÑ´Ù.
- ¿ø°Ý ¾²·¹µå¿¡ ´ëÇØ "Ư¼ö" ¸Þ½ÃÁö¸¦ Àü¼ÛÇÑ´Ù.
- ¿©·¯ºÐÀÇ ÈÅ ÇÁ·Î½ÃÀú¿¡¼ ÀÌ ¸Þ½ÃÁö¸¦ catch ÇÑ´Ù. À̰Ϳ¡ ¹ÝÀÀÇØ¼
FreeLibrary¿Í UnhookWindowsHookEx¸¦ È£ÃâÇÑ´Ù.
ÀÌÁ¦ ÈÅÀº ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼ ¶Ç´Â ¿ø°Ý ÇÁ·Î¼¼½º·ÎºÎÅÍ mapping/unmappingÀ» ÇÏ´Â µ¿¾È¿¡¸¸ ÀÌ¿ëµÇ¹Ç·Î "ÈÅÀÌ
µÇ´Â" ¾²·¹µåÀÇ performance¿¡ À¯ÀǹÌÇÑ ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ ¾Æ·¡¿¡¼ ¾ð±ÞÇÒ
LoadLibrary Å×Å©´Ð(Section
II ÂüÁ¶)º¸´Ù ´ë»ó ÇÁ·Î¼¼½º¸¦ ´ú °£¼·ÇÏ´Â DLL mapping ¸ÞÄ¿´ÏÁòÀ» ¾Ë¾Æ º¸¾Ò´Ù. ±×·¸Áö¸¸ ÀÌ ÇØ°áÃ¥Àº
LoadLibrary Å×Å©´Ð¿¡ ¹ÝÇØ À©NT¿Í À©9x¿¡ ´ëÇØ ¸ðµÎ µ¿ÀÛÇÑ´Ù.
±×·±µ¥ ¾ðÁ¦ ÀÌ Æ®¸¯À» ÀÌ¿ëÇØ¾ß ÇÒ±î? Ç×»ó DLLÀÌ ¿ø°Ý ÇÁ·Î¼¼½º¿¡¼ ¿À·£ ±â°£ Á¸ÀçÇϰí(Áï ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ¼ÓÇÏ´Â
ÄÁÆ®·ÑÀ» subclass ÇÒ °æ¿ì) ´ë»ó ÇÁ·Î¼¼½º¸¦ ÃÖ¼ÒÇÑ °£¼·ÇÏ°í ½ÍÀ» ¶§ ÀÌ¿ëÇØ¾ß ÇÑ´Ù. HookSpy¿¡¼´Â DLLÀÌ Àá½Ã
µ¿¾È(ÆÐ½º¿öµå¸¦ ¾Ë¾Æ³»±â¿¡ ÃæºÐÇÒ Á¤µµÀÇ) ÁÖÀԵDZ⠶§¹®¿¡ ÀÌ Æ®¸¯À» ÀÌ¿ëÇÏÁö ¾Ê¾Ò´Ù. ÀÌ Æ®¸¯À» º¸¿©ÁÖ±â À§ÇØ ÇÊÀÚ´Â
HookInjEx¶ó´Â ´Ù¸¥ ¿¹Á¦¸¦ ¸¸µé¾ú´Ù. HookInjEx´Â DLLÀ» "explorer.exe"·Î map/unmap Çϴµ¥
¿©±â¿¡¼ À̰ÍÀº ½ÃÀÛ ¹öưÀ» subclass ÇÑ´Ù. Áï À̰ÍÀº ½ÃÀÛ ¹öưÀÇ ¿ÞÂÊ ¸¶¿ì½º Ŭ¸¯°ú ¿À¸¥ÂÊ ¸¶¿ì½º Ŭ¸¯À»
Àüȯ(swap)ÇÑ´Ù.
HookSpy¿Í HookInjEx¿Í À̵éÀÇ ¼Ò½º´Â ÀÌ ¹®¼ÀÇ Ã¹ ¸Ó¸®¿¡ ÀÖ´Â ´Ù¿î·Îµå
ÆÐŰÁö¿¡¼ ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.
II. CreateRemoteThread¿Í LoadLibrary Å×Å©´Ð
µ¥¸ð ÀÀ¿ëÇÁ·Î±×·¥ : LibSpy
ÀϹÝÀûÀ¸·Î ¸ðµç ÇÁ·Î¼¼½º´Â
LoadLibrary API¸¦ ÀÌ¿ëÇÏ¿© DLLÀ» µ¿ÀûÀ¸·Î ·Îµå ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾î¶»°Ô ÇØ¾ß ¿ÜºÎÀÇ
ÇÁ·Î¼¼½º°¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ°Ô ÇÒ ¼ö ÀÖÀ»±î? ÇØ´äÀº CreateRemoteThread¸¦ ÀÌ¿ëÇÏ´Â
°ÍÀÌ´Ù.
¸ÕÀú LoadLibrary¿Í FreeLibrary APIÀÇ ÇÔ¼ö ¼±¾ðÀ» »ìÆìº¸ÀÚ.
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName
);
BOOL FreeLibrary(
HMODULE hLibModule
);
ÀÌÁ¦ À̵éÀ» CreateRemoteThread¿¡ Àü´ÞµÇ´Â ¾²·¹µå ·çƾÀÎ ThreadProcÀÇ
ÇÔ¼ö ¼±¾ð°ú ºñ±³Çغ¸ÀÚ.
DWORD WINAPI ThreadProc(
LPVOID lpParameter
);
À§¿¡¼ º¼ ¼ö ÀÖµíÀÌ ¸ðµç ÇÔ¼öµéÀÌ µ¿ÀÏÇÑ È£Ãâ °ü·Ê¸¦ ÀÌ¿ëÇÏ¸ç ¸ðµÎ 32ºñÆ® ÀÎÀÚ¸¦ ¹Þ¾ÆµéÀδÙ. ¶ÇÇÑ ¹ÝȯµÇ´Â °ªÀÇ Å©±â°¡
µ¿ÀÏÇÏ´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ ¿ì¸®´Â
CreateRemoteThread¿¡ ´ëÇÑ ¾²·¹µå ·çƾÀ¸·Î¼
LoadLibrary/FreeLibrary¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù.
ÇÏÁö¸¸ ¿©±â¿¡´Â µÎ °¡ÁöÀÇ ¹®Á¦°¡ ÀÖ´Ù(¾Æ·¡ÀÇ
CreateRemoteThread¿¡ ´ëÇÑ ¼³¸í ÂüÁ¶).
-
CreateRemoteThreadÀÇ lpStartAddress ÀÎÀÚ´Â ¿ø°Ý
ÇÁ·Î¼¼½º¿¡¼ÀÇ ¾²·¹µå ·çƾÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ ³ªÅ¸³»¾ß ÇÑ´Ù.
-
ThreadFunc¿¡ Àü´ÞµÇ´Â ÀÎÀÚÀÎ lpParameter°¡ ÀϹÝÀûÀÎ 32ºñÆ®
°ªÀ¸·Î ÇØ¼®µÈ´Ù¸é(FreeLibrary´Â À̰ÍÀ» HMODULE·Î ÇØ¼®ÇÔ) ¸ðµç °ÍÀº
Àß µ¹¾Æ°£´Ù. ÇÏÁö¸¸ lpParameter°¡ Æ÷ÀÎÅÍ·Î ÇØ¼®µÈ´Ù¸é(LoadLibraryA´Â
À̰ÍÀ»
char ½ºÆ®¸µ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ·Î ÇØ¼®ÇÔ) À̰ÍÀº
¿ø°Ý ÇÁ·Î¼¼½ºÀÇ Æ¯Á¤ µ¥ÀÌÅ͸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù.
ù ¹øÂ° ¹®Á¦´Â »ç½Ç ÀÚüÀûÀ¸·Î ÇØ°áµÈ´Ù.
LoadLibrary¿Í FreeLibray´Â µÑ ´Ù kernel32.dll¿¡
Á¸ÀçÇÏ´Â ÇÔ¼öµéÀÌ´Ù. kernel32´Â ¸ðµç "Á¤»ó" ÇÁ·Î¼¼½º¿¡¼ Ç×»ó Á¸ÀçÇÏ¸ç µ¿ÀÏÇÑ ·Îµå ÁÖ¼Ò¿¡ ÀÖ´Â °ÍÀÌ
º¸ÁõµÇ¹Ç·Î(ºÎ·Ï
A ÂüÁ¶) LoadLibrary/FreeLibrayÀÇ ÁÖ¼Ò´Â ¸ðµç ÇÁ·Î¼¼½º¿¡¼ ¿ª½Ã µ¿ÀÏÇÏ´Ù. À̰ÍÀº
¿ø°Ý ÇÁ·Î¼¼½º¿¡ À¯È¿ÇÑ Æ÷ÀÎÅͰ¡ Àü´ÞµÇ´Â °ÍÀ» º¸ÁõÇØÁØ´Ù.
µÎ ¹øÂ° ¹®Á¦ ¶ÇÇÑ ½±°Ô ÇØ°áµÈ´Ù. Áï ´Ü¼øÇÏ°Ô WriteProcessMemory¸¦ ÅëÇÏ¿© ¿ø°Ý
ÇÁ·Î¼¼½º¿¡ DLL ¸ðµâ À̸§(LoadLibrary¿¡ ÇÊ¿äÇÑ)À» º¹»çÇØÁØ´Ù.
±×·¡¼ CreateRemoteThread ¿Í LoadLibrary Å×Å©´ÐÀ»
ÀÌ¿ëÇÏ·Á¸é ¾Æ·¡¿Í °°Àº ´Ü°è¸¦ µû¸¥´Ù.
- ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ´ëÇÑ
HANDLEÀ» ¾ò´Â´Ù(OpenProcess). -
¿ø°Ý ÇÁ·Î¼¼½º ³»¿¡¼ DLL À̸§À» À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù(
VirtualAllocEx).
- ÇÒ´çµÈ ¸Þ¸ð¸®¿¡ Àüü °æ·Î¸¦ Æ÷ÇÔÇÏ´Â DLL À̸§À» ±â·ÏÇÑ´Ù(
WriteProcessMemory).
-
CreateRemoteThread¿Í LoadLibrary¸¦ ÀÌ¿ëÇÏ¿© ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ¿©·¯ºÐÀÇ
DLLÀ» map ÇÑ´Ù.
- ¿ø°Ý ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸°´Ù(
WaitForSingleObject). À̰ÍÀº
LoadLibrary¿¡ ´ëÇÑ È£ÃâÀÌ ¹ÝȯÇÒ ¶§±îÁö ±â´Ù¸®´Â °ÍÀÌ´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ ÀÌ ¾²·¹µå´Â ¿ì¸®ÀÇ DllMain(DLL_PROCESS_ATTACH¶ó´Â
reasonÀ¸·Î È£ÃâµÊ)ÀÌ ¹ÝȯÇÏ´Â ¼ø°£ Á¾·áÇÒ °ÍÀÌ´Ù.
- ¿ø°Ý ¾²·¹µåÀÇ Å»Ãâ Äڵ带 ¾ò´Â´Ù(
GetExitCodeThread). ÀÌ °ªÀº LoadLibrary¿¡
ÀÇÇØ ¹ÝȯµÇ´Â °ªÀ¸·Î¼ ¿ì¸®ÀÇ map µÈ DLLÀÇ base address(HMODULE)¶ó´Â Á¡¿¡
ÁÖÀÇÇ϶ó.
- ´Ü°è 2¿¡¼ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù(
VirtualFreeEx).
-
CreateRemoteThread¿Í FreeLibrary¸¦ ÀÌ¿ëÇÏ¿© ¿ø°Ý ÇÁ·Î¼¼½º¿¡¼ DLLÀ»
unload ÇÑ´Ù. FreeLibrary¿¡ ´Ü°è 6¿¡¼ ¹ÝȯµÈ HMODULEÀ»
Àü´ÞÇÑ´Ù(CreateRemoteThreadÀÇ lpParameter ¸¦ °æÀ¯ÇÏ¿©).
ÁÖÀÇ : ¿©·¯ºÐÀÇ ÁÖÀÔµÈ DLLÀÌ »õ·Î¿î ¾²·¹µå¸¦ spawn Çß´Ù¸é ÀÌ DLLÀ» unloading Çϱâ Àü¿¡ ±×µéÀÌ Á¾·áµÇ¾ú´ÂÁö¸¦
È®ÀÎÇ϶ó.
- ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸°´Ù(
WaitForSingleObject).
¶ÇÇÑ ÀÛ¾÷ÀÌ ³¡³µ´Ù¸é ¸ðµç ÇÚµéµéÀ» ´Ý´Â °ÍÀ» ÀØÁö ¸»±â ¹Ù¶õ´Ù. Áï ´Ü°è 4¿Í 8¿¡¼ »ý¼ºµÈ µÎ °³ÀÇ ¾²·¹µå¿¡ ´ëÇÑ ÇÚµé°ú
´Ü°è 1¿¡¼ ¹ÝȯµÈ ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµéÀ» ´Ý´Â´Ù.
ÀÌÁ¦ ½ÇÁ¦·Î À§ÀÇ ´Ü°èµéÀÌ ¾î¶² ½ÄÀ¸·Î ±¸ÇöµÇ¾ú´ÂÁö¸¦ »ìÆìº¸±â À§ÇØ LibSpyÀÇ ¼Ò½º ÀϺθ¦ °ËÅäÇØº¸ÀÚ. °£´ÜÈ÷ Çϱâ À§ÇØ
¿¡·¯ ó¸®¿Í À¯´ÏÄÚµå Áö¿øÀÌ Á¦°ÅµÇ¾ú´Ù.
HANDLE hThread;
char szLibPath[_MAX_PATH];
void* pLibRemote;
DWORD hLibModule;
HMODULE hKernel32 = ::GetModuleHandle("Kernel32");
pLibRemote = ::VirtualAllocEx( hProcess, NULL, sizeof(szLibPath),
MEM_COMMIT, PAGE_READWRITE );
::WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath,
sizeof(szLibPath), NULL );
hThread = ::CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress( hKernel32,
"LoadLibraryA" ),
pLibRemote, 0, NULL );
::WaitForSingleObject( hThread, INFINITE );
::GetExitCodeThread( hThread, &hLibModule );
::CloseHandle( hThread );
::VirtualFreeEx( hProcess, pLibRemote, sizeof(szLibPath), MEM_RELEASE );
¿ì¸®ÀÇ SendMessage(½ÇÁ¦·Î ¿ì¸®°¡ ÁÖÀÔÇÏ°í ½Í¾îÇÏ´Â ÄÚµå)°¡ DllMain(DLL_PROCESS_ATTACH)¿¡
À§Ä¡Çϰí ÀÖ´Ù°í °¡Á¤ÇÑ´Ù¸é À̰ÍÀº ÀÌÁ¦ ÀÌ¹Ì ½ÇÇàµÇ¾úÀ» °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÀÌÁ¦ ´ë»ó ÇÁ·Î¼¼½º¿¡¼ DLLÀ» unload ÇÒ
½ÃÁ¡ÀÌ´Ù.
hThread = ::CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress( hKernel32,
"FreeLibrary" ),
(void*)hLibModule, 0, NULL );
::WaitForSingleObject( hThread, INFINITE );
::CloseHandle( hThread );
Interprocess Communications
Áö±Ý±îÁö ¿ì¸®´Â ¿ø°Ý ÇÁ·Î¼¼½º¿¡ DLLÀ» ÁÖÀÔÇÏ´Â ¹ý¿¡ ´ëÇØ¼¸¸ ³íÇß´Ù. ÇÏÁö¸¸ ´ëºÎºÐÀÇ »óȲ¿¡¼ ÁÖÀÔµÈ DLLÀº ¿©·¯ºÐÀÇ
¿ø·¡ÀÇ ÀÀ¿ëÇÁ·Î±×·¥°ú ƯÁ¤ ¹æ½ÄÀ¸·Î Åë½ÅÀ» ÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù(ÀÌÁ¦ DLLÀº ¿ì¸®ÀÇ ·ÎÄà ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó ƯÁ¤ ¿ø°Ý
ÇÁ·Î¼¼½º¿¡ map µÇ¾ú´Ù´Â °ÍÀ» »ó±âÇ϶ó). ¿ì¸®ÀÇ Password Spy¸¦ ¿¹·Î µé¾îº¸ÀÚ. DLLÀº ½ÇÁ¦ ÆÐ½º¿öµå¸¦ Æ÷ÇÔÇÏ´Â
ÄÁÆ®·Ñ¿¡ ´ëÇÑ ÇÚµéÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ÀÌ °ªÀº ¸í¹éÈ÷ ÄÄÆÄÀÏ ½Ã¿¡ hardcord µÉ ¼ö°¡ ¾ø´Ù. ¸¶Âù°¡Áö·Î DLLÀÌ ÀÏ´Ü
ÆÐ½º¿öµå¸¦ ¾ò¾ú´Ù¸é À̰ÍÀº ¿ì¸®°¡ ÀÌ ÆÐ½º¿öµå¸¦ ÀûÀýÈ÷ µð½ºÇ÷¹ÀÌ ÇÒ ¼ö ÀÖµµ·Ï ¿ì¸®ÀÇ ÀÀ¿ëÇÁ·Î±×·¥À¸·Î Àü¼ÛÇØÁÖ¾î¾ß ÇÑ´Ù.
´ÙÇàÈ÷µµ ÀÌ·± »óȲÀ» ó¸®ÇÏ´Â ¸¹Àº ¹æ¹ýµéÀÌ ÀÖ´Ù. ¸î °¡Áö¸¸ ¿°ÅÇØº¸¸é File Mapping,
WM_COPYDATA, Ŭ¸³º¸µå ±×¸®°í ¶§¶§·Î´Â ¸Å¿ì ÆíÇÑ #pragma data_seg
µîÀÌ ÀÖ´Ù. À̵é Å×Å©´ÐÀº MSDN(Interprocess Communications ÂüÁ¶)À̳ª ´Ù¸¥ Æ©Å͸®¾ó¿¡ Àß ¹®¼ÈµÇ¾î
ÀÖÀ¸¹Ç·Î ¿©±â¼´Â Ưº°È÷ ¾ð±ÞÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ¾î·µç ÇÊÀÚ´Â LibSpy ¿¹Á¦¿¡¼ ¿ÀÁ÷ #pragma data_seg¸¸ ÀÌ¿ëÇß´Ù.
LibSpy¿Í À̰ÍÀÇ ¼Ò½º´Â ÀÌ ¹®¼ÀÇ Ã¹ ¸Ó¸®¿¡ ÀÖ´Â ´Ù¿î·Îµå ÆÐŰÁö¿¡¼ ãÀ» ¼ö
ÀÖÀ» °ÍÀÌ´Ù.
III. CreateRemoteThread¿Í WriteProcessMemory Å×Å©´Ð
µ¥¸ð ÀÀ¿ëÇÁ·Î±×·¥ : WinSpy
´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡ ƯÁ¤ Äڵ带 º¹»çÇÑ ÈÄ ÀÌ ÇÁ·Î¼¼½ºÀÇ ÄÁÅØ½ºÆ® ³»¿¡¼ ½ÇÇàÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀº ¿ø°Ý ¾²·¹µå¿Í WriteProcessMemory
API¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. µ¶¸³ÀûÀÎ DLLÀ» ÀÛ¼ºÇÏ´Â ´ë½Å ¿ì¸®´Â Äڵ带 ¿ø°Ý ÇÁ·Î¼¼½º¿¡ Á÷Á¢ º¹»çÇÑ ÈÄ(WriteProcessMemory¸¦
ÀÌ¿ëÇÏ¿©)
CreateRemoteThread¸¦ ÀÌ¿ëÇÏ¿© À̰ÍÀ» ½ÇÇàÇÑ´Ù.
¸ÕÀú
CreateRemoteThreadÀÇ ÇÔ¼ö ¼±¾ðÀ» »ìÆìº¸ÀÚ.
HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
À̰ÍÀ» CreateThread(MSDN)ÀÇ ÇÔ¼ö ¼±¾ð°ú ºñ±³Çغ¸¸é ¾Æ·¡¿Í °°Àº Â÷ÀÌÁ¡À» ¾Ë ¼ö ÀÖÀ»
°ÍÀÌ´Ù.
-
CreateRemoteThread¿¡´Â hProcess ÀÎÀÚ°¡ Ãß°¡ÀûÀ¸·Î ÀÖ´Ù.
À̰ÍÀº ¾²·¹µå°¡ »ý¼ºµÉ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµéÀÌ´Ù.
-
CreateRemoteThread¿¡¼ lpStartAddress ÀÎÀÚ´Â ¿ø°Ý
ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£¿¡¼ÀÇ ¾²·¹µåÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù. ÀÌ ÇÔ¼ö´Â ¿ø°Ý ÇÁ·Î¼¼½º¿¡ Á¸ÀçÇØ¾ß ÇϹǷΠ´Ü¼øÇÏ°Ô ·ÎÄÃ
ThreadFunc¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü´ÞÇÒ ¼ö°¡ ¾ø´Ù. ¸ÕÀú ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ÀÌ Äڵ带 º¹»çÇØ¾ß ÇÑ´Ù.
- µ¿ÀÏÇϰÔ
lpParameter°¡ °¡¸®Å°´Â µ¥ÀÌÅÍ´Â ¿ø°Ý ÇÁ·Î¼¼½º¿¡ Á¸ÀçÇØ¾ß ÇϹǷΠÀÌ°Í ¿ª½Ã
º¹»çÇØÁÖ¾î¾ß ÇÑ´Ù.
ÀÌÁ¦ ÀÌ Å×Å©´ÐÀ» Á¤¸®Çغ¸¸é ¾Æ·¡¿Í °°´Ù.
- ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ´ëÇÑ
HANDLEÀ» ¾ò´Â´Ù(OpenProces).
- ÁÖÀ﵃ µ¥ÀÌÅ͸¦ À§ÇØ ¿ø°Ý ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù(
VirtualAllocEx).
- ÇÒ´çµÈ ¸Þ¸ð¸®¿¡ ÃʱâȵÈ
INJDATA ±¸Á¶Ã¼ÀÇ º¹»çº»À» ±â·ÏÇÑ´Ù(WriteProcessMemory).
- ÁÖÀ﵃ Äڵ带 À§ÇØ ¿ø°Ý ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù.
- ÇÒ´çµÈ ¸Þ¸ð¸®¿¡
ThreadFuncÀÇ º¹»çº»À» ±â·ÏÇÑ´Ù.
-
CreateRemoteThread¸¦ ÀÌ¿ëÇÏ¿© ThreadFuncÀÇ ¿ø°Ý º¹»çº»À»
½ÃÀÛÇÑ´Ù.
- ¿ø°Ý ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸°´Ù(
WaitForSingleObject).
- ¿ø°Ý ÇÁ·Î¼¼½º¿¡¼ °á°ú¸¦ ¾ò´Â´Ù(
ReadProcessMemory ¶Ç´Â GetExitCodeThread).
- ´Ü°è 2¿Í 4¿¡¼ ÇÒ´çµÇ¾ú´ø ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù(
VirtualFreeEx).
- ´Ü°è 6°ú 1¿¡¼ ¾ò¾ú´ø ÇÚµéµéÀ» ´Ý´Â´Ù(
CloseHandle).
ThreadFunc°¡ ÁöÄÑ¾ß ÇÒ Ãß°¡ÀûÀÎ ÁÖÀÇ»çÇ×
ThreadFunc´Â kernel32.dll°ú user32.dll¿¡ ¾ø´Â
ÇÔ¼öµéÀ» È£ÃâÇØ¼´Â ¾È µÈ´Ù. kernel32¿Í user32¸¸ÀÌ ÇÁ·Î¼¼½º¿¡ Á¸ÀçÇÒ °æ¿ì(user32´Â
¸ðµç À©32 ÇÁ·Î¼¼½º¿¡ map µÇ´Â °ÍÀº ¾Æ´Ï¶ó´Â °Í¿¡ ÁÖÀÇ) ·ÎÄà ÇÁ·Î¼¼½º¿Í ´ë»ó ÇÁ·Î¼¼½º ¸ðµÎ¿¡¼ µ¿ÀÏÇÑ ·Îµå ÁÖ¼Ò¿¡ ÀÖ´Ù´Â
°ÍÀÌ º¸ÁõµÈ´Ù(ºÎ·Ï
A ÂüÁ¶). ´Ù¸¥ ¶óÀ̺귯¸®¿¡ ÀÖ´Â ÇÔ¼öµéÀÌ ÇÊ¿äÇÒ °æ¿ì ÁÖÀÔµÈ Äڵ忡 LoadLibrary¿Í GetProcAddressÀÇ
ÁÖ¼Ò¸¦ Àü´ÞÇÏ¿© ÁÖÀÔµÈ Äڵ尡 ³ª¸ÓÁö ÀÏÀ» ÀÚüÀûÀ¸·Î ó¸®ÇÏ°Ô ÇÑ´Ù. ¾î¶² ÀÌÀ¯·Ð°¡ ¹®Á¦ÀÇ DLLÀÌ ÀÌ¹Ì ´ë»ó ÇÁ·Î¼¼½º¿¡ map
µÇ¾î ÀÖ´Ù¸é LoadLibrary ´ë½Å
GetModuleHandleÀ» ÀÌ¿ëÇÒ ¼öµµ ÀÖ´Ù.
¸¶Âù°¡Áö·Î ThreadFunc
³»¿¡¼ ¿©·¯ºÐ ÀÚ½ÅÀÇ ¼ºê·çƾÀ» È£ÃâÇÏ°í ½Í´Ù¸é °¢ ·çƾÀ» ¿ø°Ý ÇÁ·Î¼¼½º¿¡ °³º°ÀûÀ¸·Î º¹»çÇÑ ÈÄ INJDATA¸¦
ÅëÇÏ¿© À̵éÀÇ ÁÖ¼Ò¸¦
ThreadFunc¿¡°Ô Á¦°øÇØÁØ´Ù.
- Á¤Àû stringµéÀ» ÀüÇô ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù. ±× º¸´Ù´Â ¸ðµç stringµéÀ»
INJDATA¸¦ ÅëÇÏ¿©
ThreadFunc¿¡ Àü´ÞÇÑ´Ù. ±× ÀÌÀ¯´Â ÄÄÆÄÀÏ·¯°¡ ¸ðµç Á¤Àû stringµéÀ» ½ÇÇà ÆÄÀÏÀÇ ".data"
¼½¼Ç¿¡ Áý¾î ³Ö°í Äڵ忡´Â ¿ÀÁ÷ reference(=Æ÷ÀÎÅÍ)¸¸ÀÌ ³²±â ¶§¹®ÀÌ´Ù. ±× °á°ú ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ÀÖ´Â
ThreadFuncÀÇ º¹»çº»Àº Á¸ÀçÇÏÁö ¾Ê´Â ¹«¾ùÀΰ¡(Àû¾îµµ ÁÖ¼Ò °ø°£¿¡ ¾ø´Â)¸¦ °¡¸®Å³ °ÍÀÌ´Ù.
- /GZ ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡¸¦ Á¦°ÅÇÑ´Ù. À̰ÍÀº µð¹ö±× ºôµåÀÇ °æ¿ì ±âº»ÀûÀ¸·Î ¼³Á¤µÈ´Ù(ºÎ·Ï
B ÂüÁ¶).
-
ThreadFunc¿Í
AfterThreadFunc¸¦ staticÀ¸·Î ¼±¾ðÇϰųª ÁõºÐ ¸µÅ©(incremental
linking)À» »ç¿ëÇÏÁö ¾Ê´Â´Ù(ºÎ·Ï
C ÂüÁ¶).
-
ThreadFuncÀÇ Áö¿ª º¯¼ö´Â ÇÑ ÆäÀÌÁö(4kb)º¸´Ù ÀÛ¾Æ¾ß ÇÑ´Ù(ºÎ·Ï
D ÂüÁ¶). µð¹ö±× ºôµå¿¡¼´Â ÀÌ¿ëÇÒ ¼ö ÀÖ´Â 4kb Áß ¾à 10¹ÙÀÌÆ® Á¤µµ°¡ ³»ºÎ º¯¼öµéÀ» À§ÇØ ÀÌ¿ëµÈ´Ù´Â Á¡¿¡
ÁÖÀÇÇ϶ó.
-
3°³º¸´Ù ¸¹Àº case ¹®À» °¡Áø switch
ºí·ÏÀÌ ÀÖ´Ù¸é ¾Æ·¡¿Í °°Àº ½ÄÀ¸·Î ºÐÇÒÇÑ´Ù.
switch( expression ) {
case constant1: statement1; goto END;
case constant2: statement2; goto END;
case constant3: statement2; goto END;
}
switch( expression ) {
case constant4: statement4; goto END;
case constant5: statement5; goto END;
case constant6: statement6; goto END;
}
END:
¶Ç´Â if-else if
½ÃÄö½º·Î ¼öÁ¤ÇÑ´Ù(ºÎ·Ï
E ÂüÁ¶).
ÀÌ ±ÔÄ¢À» ÁöŰÁö ¾Ê´Â´Ù¸é °ÅÀÇ È®½ÇÇÏ°Ô ´ë»ó ÇÁ·Î¼¼½º°¡ crash ÇÒ °ÍÀÌ´Ù. ´ë»ó ÇÁ·Î¼¼½º¿¡¼ÀÇ ÀÛ¾÷ÀÌ ¿©·¯ºÐÀÇ
ÇÁ·Î¼¼½º¿¡¼¿Í °°ÀÌ µ¿ÀÏÇÑ ÁÖ¼Ò¿¡¼ ÀÏ¾î³´Ù°í °¡Á¤Çؼ´Â ¾È µÈ´Ù´Â °ÍÀ» ºÐ¸íÈ÷ ±â¾ïÇØ¾ß ÇÑ´Ù(ºÎ·Ï
F ÂüÁ¶).
GetWindowTextRemote(A/W)
"¿ø°Ý" ¿¡µðÆ® ÄÁÆ®·Ñ¿¡¼ ÆÐ½º¿öµå¸¦ ¾ò±â À§ÇØ ÇÊ¿äÇÑ ¸ðµç ±â´ÉµéÀº GetWindowTextRemot(A/W)¿¡
ĸ½¶È µÇ¾î ÀÖ´Ù.
int GetWindowTextRemoteA( HANDLE hProcess, HWND hWnd, LPSTR lpString );
int GetWindowTextRemoteW( HANDLE hProcess, HWND hWnd, LPWSTR lpString );
ÀÎÀÚµé
-
hProcess
- ¿¡µðÆ® ÄÁÆ®·ÑÀÌ ¼ÓÇØ ÀÖ´Â ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµé
-
hWnd
- ÆÐ½º¿öµå¸¦ Æ÷ÇÔÇÏ´Â ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ´ëÇÑ ÇÚµé
-
lpString
- ÅØ½ºÆ®¸¦ ¾ò±â À§ÇÑ ¹öÆÛ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ
¹Ýȯ °ª
¹Ýȯ °ªÀº º¹»çµÈ ¹®ÀÚµéÀÇ ¼öÀÌ´Ù.
GetWindowTextRemote°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´Â Áö¸¦ º¸±â À§ÇØ ÀÌÁ¦ ¼Ò½ºÀÇ ¸î¸î ºÎºÐ(ƯÈ÷
ÁÖÀԵǴ µ¥ÀÌÅÍ¿Í ÄÚµå)À» »ìÆìº¸ÀÚ. ¹Ýº¹ÇÏÁö¸¸ °£´ÜÇÏ°Ô Çϱâ À§ÇØ À¯ÀÌÄÚµå Áö¿øÀÌ Á¦°ÅµÇ¾ú´Ù.
INJDATA
typedef LRESULT (WINAPI *SENDMESSAGE)(HWND,UINT,WPARAM,LPARAM);
typedef struct {
HWND hwnd;
SENDMESSAGE fnSendMessage;
char psText[128];
} INJDATA;
INJDATA´Â ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ÁÖÀԵǴ µ¥ÀÌÅÍ ±¸Á¶Ã¼ÀÌ´Ù. ÇÏÁö¸¸ ±×·¯±â Àü¿¡ ÀÌ ±¸Á¶Ã¼ÀÇ
SendMessageA¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â ¿ì¸®ÀÇ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼ ÃʱâȵǾî¾ß ÇÑ´Ù. ¿©±â¿¡¼ÀÇ Æ®¸¯Àº user32.dllÀº
(Á¸ÀçÇÒ °æ¿ì!) ¸ðµç ÇÁ·Î¼¼½º¿¡¼ Ç×»ó µ¿ÀÏÇÑ ÁÖ¼Ò¿¡ map µÈ´Ù´Â °ÍÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î
SendMessageAÀÇ ÁÖ¼Òµµ Ç×»ó µ¿ÀÏÇÏ´Ù. À̰ÍÀº ¿ø°Ý ÇÁ·Î¼¼½º·Î À¯È¿ÇÑ Æ÷ÀÎÅͰ¡ Àü´ÞµÇ´Â °ÍÀ»
º¸ÁõÇØÁØ´Ù.
ThreadFunc
static DWORD WINAPI ThreadFunc (INJDATA *pData)
{
pData->fnSendMessage( pData->hwnd, WM_GETTEXT,
sizeof(pData->psText),
(LPARAM)pData->psText );
return 0;
}
static void AfterThreadFunc (void)
{
}
ThradFuncÀº ¿ø°Ý ¾²·¹µå¿¡ ÀÇÇØ ½ÇÇàµÇ´Â ÄÚµåÀÌ´Ù. Èï¹Ì·Î¿î Á¡Àº ¾Æ·¡¿Í °°´Ù.
-
ThreadFuncÀÇ ÄÚµå Å©±â¸¦ °è»êÇϱâ À§ÇØ AfterThreadFunc°¡
¾î¶»°Ô ÀÌ¿ëµÇ´Â Áö¿¡ ´ëÇØ ÁÖ¸ñÇ϶ó. ÀϹÝÀûÀ¸·Î À̰ÍÀº ÃÖ¼±ÀÇ ¾ÆÀ̵ð¾î´Â ¾Æ´Ï´Ù. ¿Ö³ÄÇÏ¸é ¸µÄ¿°¡ ¿©·¯ºÐÀÇ ÇÔ¼öµéÀÇ ¼ø¼¸¦
¸¶À½´ë·Î ¹Ù²Ü ¼ö Àֱ⠶§¹®ÀÌ´Ù(Áï À̰ÍÀº ThreadFunc¸¦ AfterThreadFunc
µÚ¿¡ À§Ä¡ÇÏ°Ô ÇÒ ¼öµµ ÀÖÀ½). ÇÏÁö¸¸ ¿ì¸®ÀÇ WinSpyó·³ ÀÛÀº ÇÁ·ÎÁ§Æ®¿¡¼´Â ¿©·¯ºÐÀÇ ÇÔ¼öµéÀÇ ¼ø¼°¡ º¸Á¸µÉ
°ÍÀ̶ó´Â °ÍÀ» °ÅÀÇ È®½ÅÇÒ ¼ö ÀÖ´Ù. ÇÊ¿äÇÏ´Ù¸é È®½ÇÈ÷ Çϱâ À§ÇØ /ORDER ¸µÄ¿ ¿É¼ÇÀ» ÀÌ¿ëÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ´õ ÁÁÀº
¹æ¹ýÀº µð½º¾î¼Àºí·¯·Î ThreadFuncÀÇ Å©±â¸¦ ÃøÁ¤ÇÏ´Â °ÍÀÌ´Ù.
ÀÌ Å×Å©´ÐÀ¸·Î ¿ø°Ý ÄÁÆ®·ÑÀ» subclass ÇÏ´Â ¹ý
µ¥¸ð ÀÀ¿ëÇÁ·Î±×·¥ : InjectEx
ÀÌÁ¦ Á¶±Ý ´õ º¹ÀâÇÑ ¹®Á¦ Áï ÀÌ Å×Å©´ÐÀ¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ¼ÓÇÏ´Â ÄÁÆ®·ÑÀ» subclass ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇϱâ·Î ÇÑ´Ù.
¸ÕÀú ÀÌ ÀÛ¾÷À» ¿Ï¼öÇϱâ À§ÇØ ¿©·¯ºÐÀº ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ¾Æ·¡ÀÇ µÎ °³ÀÇ ÇÔ¼ö¸¦ º¹»çÇØ¾ß ÇÑ´Ù.
ThreadFunc : SetWindowLongÀ» ÅëÇÏ¿© ¿ø°Ý ÇÁ·Î¼¼½º¿¡
ÀÖ´Â ÄÁÆ®·ÑÀ» ½ÇÁ¦·Î subclass ÇÑ´Ù
NewProc : subclass µÈ ÄÁÆ®·ÑÀÇ »õ À©µµ¿ì ÇÁ·Î½ÃÀú
ÇÏÁö¸¸ ÁÖ¿ä ¹®Á¦´Â ¿ø°Ý
NewProc¿¡ µ¥ÀÌÅ͸¦ ¾î¶»°Ô Àü´ÞÇϴ°¡ ÇÏ´Â Á¡ÀÌ´Ù.
NewProcÀº Äݹé ÇÔ¼öÀÌ¸ç Æ¯º°ÇÑ °¡À̵å¶óÀÎÀ» µû¶ó¾ß ÇϹǷΠ¿ì¸®´Â ÀÌ ÇÔ¼ö¿¡ ÀÎÀڷμ INJDATA¿¡
´ëÇÑ Æ÷ÀÎÅ͸¦ ´Ü¼øÇÏ°Ô Àü´ÞÇÒ ¼ö°¡ ¾ø´Ù. ´ÙÇàÈ÷µµ ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ´Ù¸¥ ¹æ¹ýµéÀÌ Àִµ¥(ÇÊÀÚ´Â 2°³¸¦ ¹ß°ßÇßÀ½) À̵éÀº ¸ðµÎ
¾î¼Àºí¸® ¾ð¾î¿¡ ÀÇÁ¸ÇÑ´Ù. ±×·¡¼ Áö±Ý±îÁö´Â ¾î¼Àºí¸®¿Í °ü·ÃµÈ °ÍÀ» ºÎ·Ï¿¡ ³Ö¾ú¾ú´Âµ¥ ÀÌ°Í ¾øÀÌ´Â ´õ ÀÌ»ó ³íÀǸ¦ ÁøÇàÇÒ ¼ö°¡
¾ø¾ú´Ù.
ÇØ°áÃ¥ 1
¾Æ·¡ÀÇ ±×¸²À» º¸±â ¹Ù¶õ´Ù.

¿ø°Ý ÇÁ·Î¼¼½º¿¡¼
NewProc ¹Ù·Î Á÷Àü¿¡ INJDATA°¡ À§Ä¡ÇÑ´Ù´Â Á¡¿¡ ÁÖ¸ñÇ϶ó. ÀÌ·± ¹æ½Ä¿¡ ÀÇÇØ NewProcÀº
¿ø°Ý ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£¿¡¼ÀÇ INJDATAÀÇ ¸Þ¸ð¸® À§Ä¡¸¦ ÄÄÆÄÀÏ ½Ã¿¡ ¾Ë°Ô µÈ´Ù. ´õ Á¤È®ÇϰԴ À̰ÍÀº
ÀÚ½ÅÀÇ À§Ä¡¿¡ »ó´ëÀûÀÎ
INJDATAÀÇ ÁÖ¼Ò¸¦ ¾È´Ù. ±×¸®°í »ç½Ç »ó À̰ÍÀº ¿ì¸®°¡ ÇÊ¿ä·Î ÇÏ´Â ¸ðµç °ÍÀÌ´Ù. ÀÌÁ¦ NewProcÀº
¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.
static LRESULT CALLBACK NewProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
INJDATA* pData = (INJDATA*) NewProc;
pData--;
return pData->fnCallWindowProc( pData->fnOldProc,
hwnd,uMsg,wParam,lParam );
}
ÇÏÁö¸¸ ¿©±â¿¡´Â ¾ÆÁ÷ ¹®Á¦°¡ ÀÖ´Ù. ù ¹øÂ° ÁÙÀ» º¸±â ¹Ù¶õ´Ù.
INJDATA* pData = (INJDATA*) NewProc;
ÀÌ·± ¹æ½ÄÀ¸·Î´Â hardcode µÈ °ª(¿ì¸®ÀÇ ÇÁ·Î¼¼½º¿¡¼ÀÇ ¿øº»
NewProcÀÇ ¸Þ¸ð¸® À§Ä¡)ÀÌ
pData¿¡ µé¾î°¥ °ÍÀÌ´Ù. À̰ÍÀº ÀüÇô ¿ì¸®°¡ ¿øÇÏ´Â ¹Ù°¡ ¾Æ´Ï´Ù. ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº ÇöÀçÀÇ NewProcÀÇ
À§Ä¡°¡ ¾î¶»´ø °£¿¡ ¿ø°Ý ÇÁ·Î¼¼½º·Î ½ÇÁ¦ÀûÀ¸·Î ¿Å°ÜÁø "ÇöÀçÀÇ" NewProcÀÇ º¹»çº»ÀÇ ¸Þ¸ð¸® À§Ä¡ÀÌ´Ù.
´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ ¿ì¸®´Â ÀÏÁ¾ÀÇ "this Æ÷ÀÎÅÍ"¸¦ ÇÊ¿ä·Î ÇÑ´Ù.
C/C++¿¡¼´Â ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¹æ¹ýÀÌ ¾øÁö¸¸ ÀζóÀÎ ¾î¼Àºí¸®¸¦ ÀÌ¿ëÇϸé ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. ¼öÁ¤µÈ NewProcÀ»
»ìÆìº¸ÀÚ.
static LRESULT CALLBACK NewProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
INJDATA* pData;
_asm {
call dummy
dummy:
pop ecx
sub ecx, 9
mov pData, ecx
}
pData--;
return pData->fnCallWindowProc( pData->fnOldProc,
hwnd,uMsg,wParam,lParam );
}
ÀÌÁ¦ ¹«½¼ ÀÏÀÌ ÀϾÀ»±î? °ÅÀÇ ¸ðµç ÇÁ·Î¼¼¼´Â ½ÇÇàµÉ ´ÙÀ½ ¸í·É¾îÄÚµåÀÇ ¸Þ¸ð¸® À§Ä¡¸¦ °¡¸®Å°´Â Ư¼ö ·¹Áö½ºÅ͸¦ °¡Áö°í ÀÖ´Ù.
À̰ÍÀÌ ¼ÒÀ§ 32ºñÆ® ÀÎÅÚ ÇÁ·Î¼¼¼¿Í AMD ÇÁ·Î¼¼¼¿¡¼ EIP·Î Ç¥±âµÇ´Â instruction pointerÀÌ´Ù. EIP´Â Ư¼ö
·¹Áö½ºÅÍÀ̹ǷΠ¹ü¿ë ·¹Áö½ºÅ͵é(EAX, EBX µî)°ú °°ÀÌ ÇÁ·Î±×·¡¹ÖÀûÀ¸·Î Á¢±ÙÇÒ ¼ö°¡ ¾ø´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇϸé EIP¸¦
address Çϰí À̰ÍÀÇ ³»¿ëÀ» ¸í½ÃÀûÀ¸·Î Àаųª º¯°æÇÒ ¼ö ÀÖ´Â OpCode°¡ ¾ø´Ù. ±×·¸Áö¸¸ ±×·³¿¡µµ ºÒ±¸Çϰí EIP´Â
JMP, CALL°ú RET°ú °°Àº ¸í·É¾îÄڵ忡 ÀÇÇØ ¾Ï¹¬ÀûÀ¸·Î
º¯°æ(±×¸®°í °è¼Ó º¯°æ)ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¼ºê·çƾ CALL/RET ¸ÞÄ¿´ÏÁòÀÌ 32ºñÆ® ÀÎÅÚ
ÇÁ·Î¼¼¼¿Í AMD ÇÁ·Î¼¼½º¿¡¼ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö¸¦ »ìÆìº¸±â·Î ÇÏÀÚ.
¿©·¯ºÐÀÌ ¼ºê·çƾÀ» È£ÃâÇÒ ¶§(CALLÀ» °æÀ¯ÇÏ¿©) EIP¿¡ ¼ºê·çƾÀÇ ÁÖ¼Ò°¡ ·Îµå
µÈ´Ù. ÇÏÁö¸¸ EIP°¡ ¼öÁ¤µÇ±â Á÷Àü¿¡ À̰ÍÀÇ ±âÁ¸ °ªÀÌ ÀÚµ¿ÀûÀ¸·Î ½ºÅÿ¡ push µÈ´Ù(ÈÄ¿¡ µÇµ¹¾Æ°¡´Â instruction
pointer·Î ÀÌ¿ëÇϱâ À§ÇØ). ¼ºê·çƾÀÇ ³¡¿¡¼
RET ¸í·É¾îÄÚµå´Â ½ºÅÃÀÇ ²À´ë±â¿¡¼ popÀ» ÇÏ¿© ÀÌ °ªÀ» EIP·Î ³Ö¾îÁØ´Ù.
ÀÌÁ¦ ¿©·¯ºÐÀº CALL°ú
RET¿¡ ÀÇÇØ EIP°¡ ¾î¶»°Ô º¯°æµÇ´ÂÁö¸¦ ¾Ë¾Ò´Âµ¥ ±×·¯¸é ÇöÀç °ªÀº ¾î¶»°Ô ¾òÀ» ¼ö ÀÖÀ»±î?
¾Æ¸¶ CALLÀÌ ½ºÅÿ¡ EIP¸¦ push ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÇöÀçÀÇ °ªÀ» ¾ò±â À§ÇØ
"dummy ÇÔ¼ö"¸¦ È£ÃâÇÑ Á÷ÈÄ ½ºÅÿ¡¼ ¹Ù·Î popÀ» ÇÑ´Ù. ÀÌÁ¦ ¿ì¸®ÀÇ ÄÄÆÄÀÏ µÈ NewProc¿¡¼ÀÇ
Àüü Æ®¸¯¿¡ ´ëÇØ ¼³¸íÇϰڴÙ.
Address OpCode/Params Decoded instruction
--------------------------------------------------
:00401000 55 push ebp
:00401001 8BEC mov ebp, esp
:00401003 51 push ecx
:00401004 E800000000 call 00401009
:00401009 59 pop ecx
:0040100A 83E909 sub ecx, 00000009
:0040100D 894DFC mov [ebp-04], ecx
:00401010 8B45FC mov eax, [ebp-04]
:00401013 83E814 sub eax, 00000014
.....
.....
:0040102D 8BE5 mov esp, ebp
:0040102F 5D pop ebp
:00401030 C21000 ret 0010
- dummy ÇÔ¼ö È£Ãâ. À̰ÍÀº ´Ü¼øÈ÷ ´ÙÀ½ ¸í·É¾îÄÚµå·Î jump ÇÏ¸ç ½ºÅÿ¡ EIP¸¦ push ÇÑ´Ù.
- ½ºÅÃÀÇ °ªÀ» ECX·Î pop ÇÑ´Ù. ÀÌ °ªÀº ¿ª½Ã Á¤È®È÷
"pop ECX"
¸í·É¾îÄÚµåÀÇ ÁÖ¼ÒÀÌ´Ù.
-
NewProcÀÇ entry point¿Í "pop ECX"
¸í·É¾îÄÚµå »çÀÌÀÇ "°Å¸®"°¡ 9¹ÙÀÌÆ®¶ó´Â °Í¿¡ ÁÖ¸ñÇ϶ó. ±×·¡¼ NewProcÀÇ ÁÖ¼Ò¸¦ °è»êÇϱâ À§ÇØ
ECX¿¡¼ 9¸¦ »«´Ù.
ÀÌ·± ¹æ½Ä¿¡ ÀÇÇØ NewProcÀº ÀÚ½ÅÀÌ ½ÇÁ¦ ¾î¶² À§Ä¡·Î ¿Å°ÜÁ³´ÂÁö¿¡ °ü°è¾øÀÌ Ç×»ó ÀÚ½ÅÀÇ ÁÖ¼Ò¸¦
°è»êÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¿©·¯ºÐÀÌ ÄÄÆÄÀÏ·¯/¸µÄ¿ ¿É¼ÇÀ» ¹Ù²Ù¸é NewProcÀÇ entry point¿Í
"pop ECX" ¸í·É¾îÄÚµå »çÀÌÀÇ °Å¸®°¡ ¹Ù²ð ¼öµµ
ÀÖ´Ù´Â Á¡¿¡ À¯ÀÇÇ϶ó. ±×¸®°í ¸±¸®Áî ºôµå¿Í µð¹ö±× ºôµå »çÀÌ¿¡¼µµ ¿ª½Ã ´Ù¸£´Ù. ÇÏÁö¸¸ Áß¿äÇÑ °ÍÀº ±×·³¿¡µµ ºÒ±¸ÇÏ°í ¿©·¯ºÐÀÌ
ÄÄÆÄÀÏ ½Ã¿¡ Á¤È®ÇÑ °ªÀ» ¾Ë°í ÀÖ´Ù´Â Á¡ÀÌ´Ù.
- ¸ÕÀú ¿ì¸®ÀÇ ÇÔ¼ö¸¦ ÄÄÆÄÀÏ ÇÑ´Ù.
- µð½º¾î¼Àºí·¯·Î Á¤È®ÇÑ °Å¸®¸¦ ¾Ë¾Æ³½´Ù.
- ¸¶Áö¸·À¸·Î Á¤È®ÇÑ °Å¸® °ªÀ» °¡Áö°í ´Ù½Ã ÄÄÆÄÀÏ ÇÑ´Ù.
À̰ÍÀº InjectEx¿¡¼ ÀÌ¿ëµÈ ÇØ°áÃ¥ÀÌ´Ù. InjectEx´Â HookInjEx¿Í À¯»çÇÏ°Ô ½ÃÀÛ ¹öưÀÇ ¿ÞÂÊ, ¿À¸¥ÂÊ ¸¶¿ì½º
Ŭ¸¯À» Àüȯ(swap).
ÇØ°áÃ¥ 2
¿ø°Ý ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£¿¡¼ NewProc ¹Ù·Î ¾Õ¿¡ INJDATA¸¦ À§Ä¡ÇϰÔ
ÇÏ´Â ¹æ¹ýÀº ¿ì¸®ÀÇ ¹®Á¦¸¦ ÇØ°áÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀº ¾Æ´Ï´Ù. ¾Æ·¡ÀÇ ´Ù¸¥ ¹æ½ÄÀÇ NewProcÀ» »ìÆìº¸ÀÚ.
static LRESULT CALLBACK NewProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
INJDATA* pData = 0xA0B0C0D0;
return pData->fnCallWindowProc( pData->fnOldProc,
hwnd,uMsg,wParam,lParam );
}
¿©±â¿¡¼ 0xA0B0C0D0´Â ´Ü¼øÈ÷ ¿ø°Ý ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£¿¡¼ÀÇ INJDATAÀÇ
½ÇÁ¦(Àý´ë!) ÁÖ¼Ò¸¦ À§ÇÑ placeholderÀÌ´Ù. ÀÌ ÁÖ¼Ò´Â ÄÄÆÄÀÏ ½Ã¿¡´Â ¾Ë ¼ö ¾ø´Ù´Â °ÍÀ» »ó±âÇϱ⠹ٶõ´Ù. ÇÏÁö¸¸
VirtualAllocEx(INJDATA¸¦ À§ÇÑ)¿¡ ´ëÇÑ È£ÃâÀÌ ÀÌ·ç¾îÁø Á÷ÈÄ¿¡´Â ¿ø°Ý
ÇÁ·Î¼¼½º¿¡¼ÀÇ
INJDATAÀÇ À§Ä¡¸¦ ¾Ë°Ô µÈ´Ù.
¿ì¸®ÀÇ NewProcÀº ¾Æ·¡¿Í °°Àº ½ÄÀ¸·Î
ÄÄÆÄÀÏ µÉ °ÍÀÌ´Ù.
Address OpCode/Params Decoded instruction
--------------------------------------------------
:00401000 55 push ebp
:00401001 8BEC mov ebp, esp
:00401003 C745FCD0C0B0A0 mov [ebp-04], A0B0C0D0
:0040100A ...
....
....
:0040102D 8BE5 mov esp, ebp
:0040102F 5D pop ebp
:00401030 C21000 ret 0010
±×·¯¹Ç·Î ÄÄÆÄÀÏ µÈ ÄÚµå(16Áø °ªÀ¸·Î)´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù :
558BECC745FCD0C0B0A0......8BE55DC21000.
ÀÌÁ¦ ¾Æ·¡¿Í °°ÀÌ ÁøÇàÇÏ¸é µÉ °ÍÀÌ´Ù.
- ´ë»ó ÇÁ·Î¼¼½º¿¡
INJDATA, ThreadFunc¿Í
NewProcÀ» º¹»çÇÑ´Ù.
-
NewProcÀÇ Äڵ带 º¯°æÇÏ¿© pData°¡ INJDATAÀÇ
½ÇÁ¦ ÁÖ¼Ò¸¦ °¡¸®Å°°Ô ÇÑ´Ù.
¿¹¸¦ µé¾î ´ë»ó ÇÁ·Î¼¼½º¿¡¼ÀÇ INJDATAÀÇ ÁÖ¼Ò(VirtualAllocEx¿¡
ÀÇÇØ ¹ÝȯµÈ °ª)°¡ 0x008a0000À̶ó°í ÇÏÀÚ. ±×·¯¸é ¿ì¸®´Â NewProcÀÇ
Äڵ带 ´ÙÀ½°ú °°ÀÌ º¯°æÇÑ´Ù.
558BECC745FCD0C0B0A0......8BE55DC21000
|
<- ¿ø·¡ÀÇ NewProc
1 |
558BECC745FC00008A00......8BE55DC21000 |
<- INJDATAÀÇ ½ÇÁ¦ ÁÖ¼Ò¸¦ °¡¸®Å°´Â º¯°æµÈ NewProc |
´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ dummy °ªÀÎ A0B0C0D0À» INJDATAÀÇ ½ÇÁ¦ ÁÖ¼Ò·Î
´ëüÇÑ´Ù. 2
- ¿ø°Ý
ThreadFuncÀÇ ½ÇÇàÀ» ½ÃÀÛÇϸé À̰ÍÀÌ ¿ø°Ý ÇÁ·Î¼¼½º¿¡¼ ÄÁÆ®·ÑÀ» subclass ÇÑ´Ù.
©ö
¾î°¼ ÄÄÆÄÀÏ µÈ Äڵ忡¼ ÁÖ¼Ò
A0B0C0D0°ú
008a0000ÀÌ ¿ª¼øÀ¸·Î
º¸ÀÌ´ÂÁö ÀǾÆÇØÇÏ´Â »ç¶÷ÀÌ ÀÖÀ» °ÍÀÌ´Ù. À̰ÍÀº ÀÎÅÚ ÇÁ·Î¼¼¼¿Í AMD ÇÁ·Î¼¼¼°¡ ±×µéÀÇ (¸ÖƼ ¹ÙÀÌÆ®) µ¥ÀÌÅ͸¦ Ç¥ÇöÇϱâ À§ÇØ
little-endian Ç¥±â¹ýÀ» ÀÌ¿ëÇϱ⠶§¹®ÀÌ´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ ¼ýÀÚÀÇ ÇÏÀ§ ¹ÙÀÌÆ®°¡ ¸Þ¸ð¸®ÀÇ °¡Àå ³·Àº ÁÖ¼Ò¿¡ ÀúÀåµÇ¸ç
»óÀ§ ¹ÙÀÌÆ®°¡ °¡Àå ³ôÀº ÁÖ¼Ò¿¡ ÀúÀåµÈ´Ù.
UNIX¶ó´Â ´Ü¾î°¡ 4¹ÙÀÌÆ®¿¡ ÀúÀåµÈ´Ù°í °¡Á¤ÇÏÀÚ. big-endian ½Ã½ºÅÛ¿¡¼´Â UNIX¶ó°í ÀúÀåµÉ °ÍÀÌ´Ù. ¹Ý¸é
little-endian ½Ã½ºÅÛ¿¡¼´Â XINU·Î ÀúÀåµÉ °ÍÀÌ´Ù.
©÷ ¸î¸î (¾Ç¼º) Å©·¢µéÀº ÀÌ¿Í À¯»çÇÑ ¹æ½ÄÀ¸·Î ½ÇÇà ÆÄÀÏÀÇ Äڵ带 º¯°æÇÑ´Ù. ÇÏÁö¸¸ ÀÏ´Ü ¸Þ¸ð¸®¿¡ ·Îµå µÇ¸é
ÇÁ·Î±×·¥Àº ÀÚ½ÅÀÇ Äڵ带 º¯°æÇÒ ¼ö ¾ø´Ù(ÄÚµå´Â ½ÇÇà ÆÄÀÏÀÇ ".text" ¼½¼Ç¿¡ Á¸ÀçÇϴµ¥ ¿©±â´Â ¾²±â ±ÝÁö·Î µÇ¾î ÀÖ´Ù).
±×·³¿¡µµ ºÒ±¸ÇÏ°í ¿ì¸®´Â ¿ì¸®ÀÇ ¿ø°Ý
NewProcÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé ÀÌ ÇÔ¼ö´Â ÀÌÀü¿¡ PAGE_EXECUTE_READWRITE
permissionÀ» °¡Áø ¸Þ¸ð¸® ºÎºÐ¿¡ º¹»çµÇ¾ú±â ¶§¹®ÀÌ´Ù.
¾ðÁ¦ ÀÌ CreateRemoteThread¿Í WriteProcessMemory Å×Å©´ÐÀ» ÀÌ¿ëÇϴ°¡?
ÄÚµå ÁÖÀÔÀ» À§ÇÑ CreateRemoteThread¿Í WriteProcessMemory Å×Å©´ÐÀº ´Ù¸¥ ¹æ¹ýµé°ú ºñ±³Çغ¼ ¶§
Ãß°¡ÀûÀÎ DLLÀ» ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â´Ù´Â Á¡¿¡¼ Á» ´õ À¯¿¬¼ºÀÌ ÀÖ´Ù. ºÒÇàÈ÷µµ À̰ÍÀº ´Ù¸¥ ¹æ¹ýµé¿¡ ºñÇØ Á» ´õ º¹ÀâÇϰí Á» ´õ
À§ÇèÇϱ⵵ ÇÏ´Ù. ThreadFunc¿¡ ¹«¾ùÀΰ¡ À߸øµÇ¸é ¿ø°Ý ÇÁ·Î¼¼½º°¡ ½±°Ô crash ÇÒ ¼ö(´ëºÎºÐÀÇ
°æ¿ì ¹Ýµå½Ã) ÀÖ´Ù(ºÎ·Ï
F ÂüÁ¶). ¿ø°Ý ThreadFunc¸¦ µð¹ö±ë ÇÏ´Â °ÍÀº ¾Ç¸ùÀÌ µÉ ¼öµµ ÀÖÀ¸¹Ç·Î ÀÌ Å×Å©´ÐÀº ÃÖ´ë ¸î
°³ÀÇ ¸í·É¾îÄڵ带 ÁÖÀÔÇÒ ¶§¸¸ ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ¸¹Àº ÄÚµå Á¶°¢À» ÁÖÀÔÇÏ·Á¸é ¼½¼Ç II¿Í I¿¡¼ ¼³¸íÇß´ø ¹æ¹ý Áß Çϳª¸¦ ÀÌ¿ëÇϱâ
¹Ù¶õ´Ù.
¹Ýº¹ÇϰǴë WinSpy¿Í InjectEx¿Í À̵éÀÇ ¼Ò½º´Â ÀÌ ¹®¼ÀÇ Ã¹ ¸Ó¸®¿¡ ÀÖ´Â ´Ù¿î·Îµå ÆÐŰÁö¿¡¼ ãÀ» ¼ö
ÀÖÀ» °ÍÀÌ´Ù.
¡¡
¸¶Ä¡¸é¼
¸¶Áö¸·À¸·Î Áö±Ý±îÁö ¼³¸íÇØ¿Ô´ø °ÍÀ» Á¤¸®Çغ¸±â·Î ÇÑ´Ù.
|
OS |
ÇÁ·Î¼¼½º |
| I. ÈÅ |
À©9x¿Í À©NT |
USER32.DLL1°ú ¸µÅ©ÇÏ´Â ÇÁ·Î¼¼½ºµé¸¸ |
| II. CreateRemoteThread¿Í LoadLibrary |
À©NT¸¸2 |
½Ã½ºÅÛ ¼ºñ½º4¸¦ Æ÷ÇÔÇÑ ¸ðµç ÇÁ·Î¼¼½ºµé3 |
| III. CreateRemoteThread¿Í WriteProcessMemory |
À©NT¸¸ |
½Ã½ºÅÛ ¼ºñ½º¸¦ Æ÷ÇÔÇÑ ¸ðµç ÇÁ·Î¼¼½ºµé |
- ¸í¹éÈ÷ ¸Þ½ÃÁö Å¥°¡ ¾ø´Â ¾²·¹µå´Â ÈÅÀ» °É ¼ö ¾ø´Ù. ±×¸®°í
SetWindowsHookEx´Â ½Ã½ºÅÛ ¼ºñ½º¿Í´Â µ¿ÀÛÇÏÁö ¾Ê´Â´Ù(À̵éÀÌ USER32.DLL°ú ¸µÅ©µÇ¾î
ÀÖ´Ù°í ÇÏ´õ¶óµµ).
- À©9x¿¡´Â
CreateRemoteThreadµµ
VirtualAllocExµµ ¾ø´Ù(»ç½Ç »ó À̵éÀº À©9x¿¡¼ emulate µÉ ¼ö Àִµ¥ À̰ÍÀº ¿À·¡ µÈ
¿¾³¯ À̾߱âÀÌ´Ù).
- ¸ðµç ÇÁ·Î¼¼½º = ¸ðµç À©32 ÇÁ·Î¼¼½º + csrss.exe
°íÀ¯(native)ÀÇ ÀÀ¿ëÇÁ·Î±×·¥µé(smss.exe, os2ss.exe, autochk.exe
µî)Àº À©32 API¸¦ ÀÌ¿ëÇÏÁö ¾ÊÀ¸¸ç kernel32.dll¿¡ ´ëÇØ¼µµ ¸µÅ©ÇÏÁö ¾Ê´Â´Ù. À¯ÀÏÇÑ ¿¹¿Ü´Â À©32
¼ºê½Ã½ºÅÛ ÀÚüÀÎ csrss.exeÀÌ´Ù. À̰ÍÀº °íÀ¯(native)ÀÇ ÀÀ¿ëÇÁ·Î±×·¥ÀÌÁö¸¸ À̰ÍÀÇ ¶óÀ̺귯¸®(~winsrv.dll)
Áß ÀϺδ kernel32.dllÀ» Æ÷ÇÔÇÑ À©32 DLLµéÀ» ÇÊ¿ä·Î ÇÑ´Ù.
- ½Ã½ºÅÛ ¼ºñ½º(lsass.exe,
services.exe, winlogon.exe µî)³ª csrss.exe¿¡ Äڵ带 ÁÖÀÔÇÏ°í ½Í´Ù¸é ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµéÀ»
¿±â(
OpenProcess) Àü¿¡ ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» "SeDebugPrivilege"·Î ¼³Á¤ÇÑ´Ù(AdjustTokenPrivileges).
ÀÌÁ¦ °ÅÀÇ ³¡³µ´Ù. ÇÑ °¡Áö ´õ ¸í½ÉÇØµÎ¾î¾ß ÇÒ °ÍÀÌ ÀÖ´Ù. ¿©·¯ºÐÀÇ ÁÖÀÔµÈ ÄÚµå´Â ƯÈ÷ ¹«¾ùÀΰ¡ À߸øµÇ¾úÀ» °æ¿ì ´ë»ó
ÇÁ·Î¼¼½º¸¦ ½±°Ô ¸ÛûÇÑ »óÅ·Π¸ô¾Æ³Ö´Â´Ù. ºÐ¸íÈ÷ ±â¾ïÇ϶ó. Èû¿¡´Â Ã¥ÀÓÀÌ µû¸¥´Ù!
ÀÌ ¹®¼ÀÇ ¸¹Àº ¿¹Á¦µéÀÌ ÆÐ½º¿öµå¿¡ °üÇÑ °ÍÀ̹ǷΠ¿©·¯ºÐÀº Zhefu ZhangÀÌ ¾´ Super Password
Spy++¸¦ Èï¹Ì·Ó°Ô »ý°¢ÇÒ Áöµµ ¸ð¸¥´Ù. °Å±â¿¡¼ ±×´Â ÀÎÅÍ³Ý ÀͽºÇ÷η¯ ÆÐ½º¿öµå Çʵ忡¼ ÆÐ½º¿öµå¸¦ ¾ò¾î¿À´Â ¹æ¹ý¿¡ ´ëÇØ
¼³¸íÇÑ´Ù. ´õ±¸³ª ±×·± °ø°Ýµé·ÎºÎÅÍ ¿©·¯ºÐÀÇ ÆÐ½º¿öµå ÄÁÆ®·ÑµéÀ» º¸È£ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼µµ º¸¿©ÁØ´Ù.
Ã߽Š: ¹®¼¸¦ ÀÛ¼ºÇϰí ÃâÆÇÇÏ´Â »ç¶÷ÀÌ ¹Þ´Â À¯ÀÏÇÑ º¸»óÀ̶õ ±×°¡ ¹Þ°Ô µÇ´Â feedbackÀÌ´Ù. ±×·¯¹Ç·Î ÀÌ ¹®¼°¡
À¯¿ëÇÏ´Ù°í »ý°¢Çϸé comment¸¦ ³²±â°Å³ª ÀÌ ¹®¼¸¦ vote ÇØÁֱ⠹ٶõ´Ù(
). ±×¸®°í ´õ Áß¿äÇÑ °ÍÀ¸·Î¼ ¹«¾ùÀΰ¡ À߸øµÇ¾ú°Å³ª ¹ö±×°¡ ÀÖ°í À̰ͺ¸´Ù ´õ ³ªÀº
¹æ¹ýÀÌ ÀÖ´ÙµçÁö ¶Ç´Â ¹º°¡ ¸í·áÇÏÁö ¾ÊÀº °ÍÀÌ ÀÖ´Ù¸é ÇÊÀÚ¿¡°Ô ¾Ë·ÁÁֱ⠹ٶõ´Ù.
°¨»çÀÇ ¸»
¸ÕÀú ÀÌ "¹®¼"°¡ óÀ½À¸·Î ÃâÆÇµÇ¾ú´ø CodeGuruÀÇ µ¶ÀÚ ¿©·¯ºÐ²² °¨»ç µå¸°´Ù. ÀÌ ¹®¼°¡ ÃʱâÀÇ 1200 ´Ü¾î Á¤µµÀÇ
Å©±â¿¡¼ ÇöÀçÀÇ 6000 ´Ü¾îÀÇ Å©±â·Î Ä¿Áö°Ô µÇ¾ú´ø °ÍÀº ÁÖ·Î ¿©·¯ºÐÀÇ Áú¹®µé ¶§¹®À̾ú´Ù. ÇÏÁö¸¸ ƯÈ÷ Æò°¡ÇÒ ¸¸ÇÑ ÇÑ »ç¶÷¸¸
Ã߸°´Ù¸é ±×´Â Rado PichaÀÌ´Ù. ÀÌ ¹®¼ÀÇ ¸¹Àº ºÎºÐµéÀº ±×ÀÇ Á¦¾ð°ú ¼³¸íÀ¸·ÎºÎÅÍ µµ¿òÀ» ¹Þ¾Ò´Ù. ¸¶Áö¸·À¸·Î ¿µ¾î¶ó´Â
º¹º´À¸·ÎºÎÅÍ ÇÊÀÚ¸¦ µµ¿ÍÁÖ¾î ÀÌ ¹®¼¸¦ Á» ´õ Àб⠽±°Ô ¸¸µé¾îÁØ Susan Moore¿¡°Ô °¨»ç µå¸°´Ù.
-
A) ¾î°¼ kernel32.dll°ú user32.dllÀº Ç×»ó °°Àº ÁÖ¼Ò¿¡ map µÇ´Â°¡?
- ÇÊÀÚÀÇ ÃßÁ¤ : ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ÇÁ·Î±×·¡¸Ó°¡ ÀÌ·¸°Ô Çϸé À¯¿ëÇÑ ¼Óµµ ÃÖÀûÈ ¼ö´ÜÀÌ µÉ ¼ö ÀÖ´Ù°í »ý°¢Ç߱⠶§¹®¿¡. ±×
ÀÌÀ¯´Â ¾Æ·¡¿Í °°´Ù.
ÀϹÝÀûÀ¸·Î ½ÇÇà ÆÄÀÏÀº ".reloc" ¼½¼ÇÀ» Æ÷ÇÔÇÑ ¿©·¯ °³ÀÇ ¼½¼ÇÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
¸µÄ¿°¡ EXE ÆÄÀÏÀ̳ª DLL ÆÄÀÏÀ» »ý¼ºÇÒ ¶§ À̰ÍÀº ÆÄÀÏÀÌ ¸Þ¸ð¸®ÀÇ ¾îµð¿¡ map µÉ °ÍÀÎÁö¸¦ °¡Á¤ÇÑ´Ù. À̰ÍÀÌ ¼ÒÀ§
°¡Á¤µÈ/¼±È£µÇ´Â ·Îµå/º£À̽º ÁÖ¼ÒÀÌ´Ù. À̹ÌÁö¿¡¼ ¸ðµç Àý´ë ÁÖ¼ÒµéÀº ÀÌ ¸µÄ¿¿¡ ÀÇÇØ °¡Á¤µÈ ·Îµå ÁÖ¼Ò¸¦ ±â¹ÝÀ¸·Î ÇÑ´Ù. ¾î¶²
ÀÌÀ¯·Îµç À̹ÌÁö°¡ ÀÌ ÁÖ¼Ò·Î ·Îµå µÇÁö ¸øÇÒ °æ¿ì PE(Portable Executable) ·Î´õ´Â À̹ÌÁöÀÇ ¸ðµç Àý´ë ÁÖ¼ÒµéÀ»
fix ÇØ¾ß ÇÑ´Ù. ÀÌ ¶§¹®¿¡ ".reloc" ¼½¼ÇÀÌ ÀÖ´Â °ÍÀÌ´Ù. À̰ÍÀº À̹ÌÁöÀÇ ¸ðµç À§Ä¡µé¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ Æ÷ÇÔÇϴµ¥
¿©±â¿¡¼ ¸µÄ¿ÀÇ °¡Á¤µÈ ·Îµå ÁÖ¼Ò¿Í ½ÇÁ¦ÀÇ ·Îµå ÁÖ¼Ò°£ÀÇ Â÷À̰¡ °¡°øµÉ Çʿ䰡 ÀÖ´Ù(¾î·µç ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ »ý¼ºµÇ´Â ´ëºÎºÐÀÇ
¸í·É¾îÄÚµåµéÀº ÀÏÁ¾ÀÇ »ó´ë ÁÖ¼Ò¸¦ ÀÌ¿ëÇϹǷΠ»ý°¢º¸´Ù´Â ±×·¸°Ô ¸¹Áö ¾ÊÀº relocationÀÌ ÀϾٴ °Í¿¡ ÁÖÀÇÇ϶ó). ¹Ý¸é
·Î´õ°¡ ¸µÄ¿ÀÇ °¡Á¤µÈ ±âº» ÁÖ¼Ò·Î À̹ÌÁö¸¦ ·Îµå ÇÒ ¼ö ÀÖ´Ù¸é ".reloc" ¼½¼ÇÀº ¿ÏÀüÈ÷ ¹«½ÃµÈ´Ù.
±×·±µ¥ ¾î°¼
kernel32.dll, user32.dll°ú À̵éÀÇ ·Îµå ÁÖ¼ÒµéÀÌ ÀÌ·± ½ºÅ丮¿¡ µü ¸Â¾Æ ¶³¾îÁú±î?
¸ðµç À©32 ÀÀ¿ëÇÁ·Î±×·¥ÀÌ kernel32.dllÀ» ÇÊ¿ä·Î ÇÏ°í ´ëºÎºÐÀÇ ÀÀ¿ëÇÁ·Î±×·¥ÀÌ user32.dllÀ»
ÇÊ¿ä·Î ÇϹǷΠÀ̵éÀ» Ç×»ó ±×µé(kernel32 and
user32)ÀÇ ¼±È£µÇ´Â ±âº» ÁÖ¼Ò·Î mapping ÇÏ¸é ¸ðµç ½ÇÇà ÆÄÀϵéÀÇ ·Îµå ½Ã°£À» Çâ»óÇÒ ¼ö ÀÖÀ» °ÍÀ̱â
¶§¹®ÀÌ´Ù. ±×·¯¸é ·Î´õ´Â kernel32.dll°ú user32.dllÀÇ ÁÖ¼Ò¸¦ ÀüÇô(¿ÏÀüÈ÷) fix ÇÒ
Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù.
¾Æ·¡ÀÇ ¿¹Á¦¸¦ Á¦½ÃÇÏ¸é¼ ÀÌ Åä·ÐÀ» ¸¶Ä¡±â·Î ÇÑ´Ù.
ƯÁ¤ App.exeÀÇ À̹ÌÁö base¸¦ Kernel32(/base:"0x77e80000")
³ª user32(/base:"0x77e10000")ÀÇ ¼±È£µÇ´Â base ÁÖ¼Ò·Î ¼³Á¤ÇÑ´Ù.
App.exe°¡ user32¿¡¼ import¸¦ ÇÏÁö ¾Ê´Â´Ù¸é ´Ü¼øÈ÷ À̰ÍÀ» LoadLibrary
ÇÑ´Ù. ±×·± ÈÄ App.exe¸¦ ÄÄÆÄÀÏ Çϰí À̰ÍÀ» ½ÇÇàÇØº¸ÀÚ. ¿¡·¯ ¹Ú½º°¡ Æ¢¾î³ª¿À°í("Illegal System DLL
Relocation") App.exeÀÇ ·Îµå°¡ ½ÇÆÐÇÑ´Ù.
¿Ö ±×·²±î? ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÒ ¶§ À©2000, À©XP¿Í À©2003ÀÇ ·Î´õ´Â kernel32.dll°ú user32.dll(À̵éÀÇ
À̸§Àº ·Î´õ¿¡ hardcode µÇ¾î ÀÖÀ½)ÀÌ ±×µéÀÇ ¼±È£µÇ´Â base¿¡ map µÇ´ÂÁö¸¦ üũ ÇÑ´Ù. ±×·¸Áö ¸øÇÒ °æ¿ì ÇÏµå ¿¡·¯°¡
¹ß»ýÇÑ´Ù. À©NT 4¿¡¼´Â ole32.dllµµ üũ µÈ´Ù. À©NT 3.51 ÀÌÇÏ¿¡¼´Â ÀÌ·± üũµéÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¹Ç·Î
kernel32.dll°ú user32.dllÀº ¾î´À À§Ä¡¿¡³ª ¿Ã ¼ö ÀÖ´Ù. Ç×»ó ÀÚ½ÅÀÇ base ÁÖ¼Ò¿¡
ÀÖ¾î¾ß ÇÏ´Â À¯ÀÏÇÑ ¸ðµâÀº ntdll.dllÀÌ´Ù. ·Î´õ´Â À̰ÍÀ» üũ ÇÏÁö ¾ÊÁö¸¸ ntdll.dllÀÌ
ÀÚ½ÅÀÇ base¿¡ ¾øÀ¸¸é ÇÁ·Î¼¼½º°¡ »ý¼ºµÉ ¼ö ¾ø´Ù.
¿ä¾àÇÏÀÚ¸é À©NT 4 À̻󿡼
- Ç×»ó ÀÚ½ÅÀÇ base ÁÖ¼Ò·Î map µÇ´Â dllµé : kernel32.dll,
user32.dll°ú ntdll.dll.
- ¸ðµç À©32 ÀÀ¿ëÇÁ·Î±×·¥(+ csrss.exe)¿¡ Á¸ÀçÇÏ´Â dllµé :
kernel32.dll°ú ntdll.dll.
- °íÀ¯ÀÇ ÀÀ¿ëÇÁ·Î±×·¥±îÁöµµ Æ÷ÇÔÇÑ ¸ðµç ÇÁ·Î¼¼½º¿¡ Á¸ÀçÇÏ´Â À¯ÀÏÇÑ dll : ntdll.dll.
-
B) /GZ ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡
- µð¹ö±× ºôµå¿¡¼ /GZ ÄÄÆÄÀÏ·¯ Ư¼ºÀº ±âº»ÀûÀ¸·Î ÄÑÁø´Ù. ¿ì¸®´Â ¸î¸î ¿¡·¯µéÀ» catch Çϱâ À§ÇØ À̰ÍÀ» ÀÌ¿ëÇÒ ¼ö
ÀÖ´Ù(ÀÚ¼¼ÇÑ °ÍÀº ¹®¼¸¦ ÂüÁ¶). ±×·±µ¥ ¿ì¸®ÀÇ ½ÇÇà ÆÄÀÏ¿¡¼ À̰ÍÀº ¹«¾ùÀ» ÀǹÌÇϴ°¡?
/GZ ¿É¼ÇÀÌ ÄÑÁ³À» ¶§ ÄÄÆÄÀÏ·¯´Â
¿ì¸®ÀÇ ÇÔ¼ö ³»¿¡¼ ESP ½ºÅà Æ÷ÀÎÅͰ¡ º¯°æµÇÁö ¾Ê¾Ò´ÂÁö °ËÁõÇÏ´Â ÇÔ¼ö È£Ãâ(¸ðµç ÇÔ¼öÀÇ °ÅÀÇ ³¡¿¡ Ãß°¡µÇ´Â)À» Æ÷ÇÔÇÏ¿© ½ÇÇà
ÆÄÀÏ¿¡ Á¸ÀçÇÏ´Â ¸ðµç ÇÔ¼ö¿¡ ´ëÇØ Ãß°¡ÀûÀÎ Äڵ带 Ãß°¡ÇÒ °ÍÀÌ´Ù. ±×·±µ¥ Àá±ñ¸¸. ThreadFunc¿¡
ÇÔ¼ö È£ÃâÀÌ Ãß°¡µÈ´Ù°í? ±×°ÍÀº Àç¾ÓÀ¸·Î °¡´Â ±æÀÌ´Ù. ÀÌÁ¦ ThreadFuncÀÇ ¿ø°Ý º¹»çº»Àº ¿ø°Ý
ÇÁ·Î¼¼½º¿¡(Àû¾îµµ °°Àº ÁÖ¼Ò¿¡) Á¸ÀçÇÏÁö ¾Ê´Â ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀÌ´Ù.
-
C) Á¤Àû ÇÔ¼ö ´ë ÁõºÐ ¸µÅ©(Incremental linking)
- Incremental linkingÀº ÀÀ¿ëÇÁ·Î±×·¥À» ±¸ÃàÇÒ ¶§ ¸µÅ© ½Ã°£À» ª°Ô Çϱâ À§ÇØ ÀÌ¿ëµÈ´Ù. Á¤»óÀûÀ¸·Î ¸µÅ© µÈ
½ÇÇà ÆÄÀϰú incremetal·Î ¸µÅ© µÈ ½ÇÇà ÆÄÀÏ »çÀÌÀÇ Â÷ÀÌ´Â incremental·Î ¸µÅ© µÈ ½ÇÇà ÆÄÀÏÀÇ °æ¿ì °¢ ÇÔ¼ö
È£ÃâÀÌ ¸µÄ¿¿¡ ÀÇÇØ »ý¼ºµÇ´Â Ãß°¡ÀûÀÎ
JMP ¸í·É¾îÄÚµå·Î °£´Ù´Â Á¡ÀÌ´Ù(staticÀ¸·Î ¼±¾ðµÈ ÇÔ¼öµéÀº ÀÌ
±ÔÄ¢¿¡ ´ëÇØ ¿¹¿ÜÀÌ´Ù). À̵é JMPµéÀº ÇÔ¼ö¸¦ ÂüÁ¶ÇÏ´Â ¸ðµç CALL
¸í·É¾îÄÚµåµéÀ» °»½ÅÇÏÁö ¾Ê°íµµ ¸µÄ¿°¡ ¸Þ¸ð¸®¿¡¼ ÇÔ¼öµéÀ» À̵¿ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÇÏÁö¸¸ ¹®Á¦Á¡À» ¾ß±âÇÏ´Â °Íµµ ¹Ù·Î ÀÌ
JMPÀÌ´Ù. ÀÌÁ¦ ThreadFunc¿Í AfterThreadFunc´Â
½ÇÁ¦ÀÇ ÄÚµå ´ë½Å¿¡ JMP
¸í·É¾îÄڵ带 °¡¸®Å³ °ÍÀÌ´Ù. ±×·¡¼ ¾Æ·¡¿Í °°Àº ½ÄÀ¸·Î
ThreadFuncÀÇ Å©±â¸¦ °è»êÇÒ ¶§ const int cbCodeSize = ((LPBYTE) AfterThreadFunc - (LPBYTE) ThreadFunc);
À̰ÍÀº »ç½Ç»ó °¢°¢ ThreadFunc¿Í AfterThreadFunc¸¦ °¡¸®Å°´Â JMPµé
»çÀÌÀÇ "°Å¸®"¸¦ °è»êÇÒ °ÍÀÌ´Ù(º¸Åë À̵éÀº ¹Ù·Î ¿¬ÀÌ¾î¼ ³ªÅ¸³¯ °ÍÀÌ´Ù. ÇÏÁö¸¸ À̰ÍÀº °í·ÁÇÏÁö ¸»¶ó). ÀÌÁ¦ ¿ì¸®ÀÇ ThreadFunc´Â
ÁÖ¼Ò 004014C0¿¡ ÀÖ°í ¿©±â¿¡ ´ëÇÑ JMP
¸í·É¾îÄÚµå´Â 00401020¿¡ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. :00401020 jmp 004014C0
...
:004014C0 push EBP
:004014C1 mov EBP, ESP
...
±×·¯¸é ¾Æ·¡ÀÇ ÄÚµå´Â
WriteProcessMemory( .., &ThreadFunc, cbCodeSize, ..);
¿ø°Ý ÇÁ·Î¼¼½º¿¡ ½ÇÁ¦ÀÇ ThreadFunc°¡ ¾Æ´Ï¶ó "JMP 004014C0"
¸í·É¾îÄÚµå(±×¸®°í ±× µÚ¿¡ ¿À´Â
cbCodeSize ¹üÀ§ ³»ÀÇ ¸ðµç ¸í·É¾îÄÚµåµé)¸¦ º¹»çÇÒ °ÍÀÌ´Ù. ¿ø°Ý ¾²·¹µå°¡ ½ÇÇàÇÒ Ã¹ ¹øÂ° ÄÚµå´Â "JMP
004014C0"ÀÏ °ÍÀÌ´Ù. ±×·±µ¥ À̰ÍÀº ¿ø°Ý ¾²·¹µå¸¸ÀÌ ¾Æ´Ï¶ó Àüü ÇÁ·Î¼¼½º¿¡¼µµ °¡Àå ¸¶Áö¸·ÀÇ
¸í·É¾îÄÚµåµéÀÏ °ÍÀÌ´Ù.
ÇÏÁö¸¸ ÀÌ JMP ¸í·É¾îÄÚµå "±ÔÄ¢"¿¡´Â ¿¹¿Ü°¡ ÀÖ´Ù. ÇÔ¼ö°¡ staticÀ¸·Î ¼±¾ðµÇ¸é incremental·Î ¸µÅ©µÇ¾ú´õ¶óµµ ÇÔ¼ö°¡
Á÷Á¢ È£ÃâµÉ °ÍÀÌ´Ù. ±ÔÄ¢ #4¿¡¼ ThreadFunc¿Í
AfterThreadFunc¸¦ staticÀ¸·Î ¼±¾ðÇϰųª ÁõºÐ ¸µÅ©(incremental
linking)À» »ç¿ëÇÏÁö ¾Ê´Â´Ù°í Çß´ø ÀÌÀ¯´Â ÀÌ ¶§¹®ÀÌ´Ù. (incremental linkingÀÇ ¸î °¡Áö ´Ù¸¥ Ãø¸é¿¡ °üÇÑ
°ÍÀº Matt PietrekÀÌ ¾´ "Remove Fatty Deposits from Your Applications Using
Our 32-bit Liposuction Tools" ¹®¼¿¡¼ ¹ß°ßÇÒ ¼ö ÀÖ´Ù)
D) ¾î°¼ ¿ì¸®ÀÇ ThreadFunc´Â 4kÀÇ Áö¿ª º¯¼ö¹Û¿¡ °¡ÁöÁö ¸øÇÒ±î?
- Áö¿ª º¯¼öµéÀº Ç×»ó ½ºÅÿ¡ ÀúÀåµÈ´Ù. ¾î¶² ÇÔ¼ö°¡ ¸»ÇÏÀÚ¸é 256¹ÙÀÌÆ®ÀÇ Áö¿ª º¯¼ö¸¦ °¡Áø´Ù¸é ÇÔ¼ö¿¡ ÁøÀÔÇÒ ¶§(´õ
Á¤È®ÇϰԴ ÇÔ¼ö ÇÁ·Ñ·Î±×¿¡¼) ½ºÅà Æ÷ÀÎÅͰ¡ 256¸¸Å °¨¼ÒÇÑ´Ù. ¾Æ·¡ÀÇ ÇÔ¼ö´Â
void Dummy(void) {
BYTE var[256];
var[0] = 0;
var[1] = 1;
var[255] = 255;
}
-
¿¹ÄÁ´ë ¾Æ·¡¿Í À¯»çÇÏ°Ô ÄÄÆÄÀÏ µÈ´Ù.
:00401000 push ebp
:00401001 mov ebp, esp
:00401003 sub esp, 00000100
:00401006 mov byte ptr [esp], 00
:0040100A mov byte ptr [esp+01], 01
:0040100F mov byte ptr [esp+FF], FF
:00401017 mov esp, ebp
:00401019 pop ebp
:0040101A ret
À§ÀÇ ¿¹Á¦¿¡¼ ½ºÅà Æ÷ÀÎÅÍ(ESP)°¡ ¾î¶² ½ÄÀ¸·Î º¯°æµÇ¾ú´ÂÁö¿¡ ÁÖ¸ñÇ϶ó. ±×·±µ¥ ÇÔ¼ö°¡ Áö¿ª º¯¼ö·Î¼ 4kb ÀÌ»óÀ» ÇÊ¿ä·Î
ÇÑ´Ù¸é ¹«¾ùÀÌ ´Þ¶óÁö´Â °ÍÀϱî? ±×·² °æ¿ì ½ºÅà Æ÷ÀÎÅÍ´Â Á÷Á¢ÀûÀ¸·Î º¯°æµÇÁö ¾Ê´Â´Ù. ±×º¸´Ù´Â ´Ù¸¥ ÇÔ¼ö(stack probe)°¡
È£ÃâµÇ¸ç À̰ÍÀÌ ½ºÅÃÀ» ÀûÀýÇÏ°Ô º¯°æÇÑ´Ù. ÇÏÁö¸¸ ÀÌ Ãß°¡ÀûÀÎ ÇÔ¼ö È£ÃâÀº ºÐ¸íÈ÷ ¿ì¸®ÀÇ ThreadFunc¸¦
"corrupt" ÇÏ°Ô ¸¸µç´Ù. ¿Ö³ÄÇÏ¸é ¿ø°Ý º¹»çº»Àº °Å±â¿¡ ÀÖÁö ¾ÊÀº ¹«¾ùÀΰ¡¸¦ È£ÃâÇÏ·Á°í ÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù.
¹®¼¿¡¼´Â stack probe¿Í /Gs ÄÄÆÄÀÏ·¯ ¿É¼Ç¿¡ ´ëÇØ ¾î¶² ½ÄÀ¸·Î ¾ð±ÞÇϰí ÀÖ´ÂÁö¸¦ »ìÆìº¸ÀÚ.
"/Gssize ¿É¼ÇÀº stack probe¸¦ Á¦¾îÇÒ ¼ö ÀÖ´Â Áøº¸µÈ Ư¼ºÀÌ´Ù. stack
probe´Â ÄÄÆÄÀÏ·¯°¡ ¸ðµç ÇÔ¼ö È£Ãâ¿¡ »ðÀÔÇÏ´Â ÀÏ·ÃÀÇ ÄÚµåÀÌ´Ù. Ȱ¼ºÈµÇ¾úÀ» °æ¿ì stack probe´Â °ü·ÃµÈ ÇÔ¼öÀÇ
Áö¿ª º¯¼öµéÀ» ÀúÀåÇϱâ À§ÇØ ÇÊ¿äÇÑ °ø°£ÀÇ ¾ç¸¸ÅÀ» ¸Þ¸ð¸®¿¡¼ ¹«ÇØÇÏ°Ô ¾ò¾î¿Â´Ù.¾î¶² ÇÔ¼ö°¡ Áö¿ª º¯¼öµéÀ» À§ÇØ size
½ºÅà °ø°£ ÀÌ»óÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é stack probe°¡ Ȱ¼ºÈµÈ´Ù. sizeÀÇ ±âº» °ªÀº ÇÑ ÆäÀÌÁöÀÇ
Å©±â(80x86 ÇÁ·Î¼¼¼¿¡¼´Â 4kb)ÀÌ´Ù. ÀÌ °ªÀº ½ÇÇà ½Ã¿¡ ÇÁ·Î±×·¥ ½ºÅÿ¡ commit µÇ¾ú´ø ¸Þ¸ð¸®ÀÇ ¾çÀ» ´Ã¸®±â
À§ÇÑ À©32¿Í À©NT °¡»ó ¸Þ¸ð¸® ¸Å´ÏÀú »çÀÌÀÇ ÁÖÀÇ ±í°Ô Á¶ÀýµÇ´Â »óÈ£ ÀÛ¿ëÀ» Çã¿ëÇØÁØ´Ù."
¸î¸î »ç¶÷Àº À§ÀÇ ¹®Àå "stack probe´Â ... ¸Þ¸ð¸®¿¡¼ ¹«ÇØÇÏ°Ô ¾ò¾î¿Â´Ù"´Â ¹®ÀåÀ» ÀǾÆÇÏ°Ô »ý°¢ÇÒ °ÍÀ̶ó°í
»ý°¢µÈ´Ù. Àúµé ÄÄÆÄÀÏ·Î ¿É¼Çµé(±×µéÀÇ ¼³¸í¿¡ µû¸£¸é!)Àº ±× À̸éÀ» µé¿©´Ù º¸°í ¹«¾ùÀÌ ÁøÇàµÇ°í ÀÖ´ÂÁö¸¦ ¾Ë ¶§±îÁö´Â ¶§¶§·Î
ÁøÂ¥ °ñÄ¡ ¾ÆÇÁ´Ù. ¿¹ÄÁ´ë ¾î¶² ÇÔ¼ö°¡ ÀÚ½ÅÀÇ Áö¿ª º¯¼öµéÀ» À§ÇØ 12kbÀÇ °ø°£À» ÇÊ¿ä·Î ÇÑ´Ù¸é ½ºÅÃÀÇ ¸Þ¸ð¸®´Â ¾Æ·¡¿Í °°Àº
½ÄÀ¸·Î "ÇÒ´ç"(´õ Á¤È®ÇϰԴ commit)µÉ °ÍÀÌ´Ù.
sub esp, 0x1000
test [esp], eax
sub esp, 0x1000
test [esp], eax
sub esp, 0x1000
test [esp], eax
½ºÅà Æ÷ÀÎÅͰ¡ 4kb ´ÜÀ§·Î ¾î¶»°Ô º¯°æµÇ´ÂÁö¿¡ ÁÖ¸ñÇÏ°í ´õ Áß¿äÇÑ °ÍÀ¸·Î¼ °¢ ½ºÅÜ ÈÄ¿¡ ¾î¶² ½ÄÀ¸·Î ½ºÅÃÀÇ ¹Ù´ÚÀÌ
"touch" µÇ´ÂÁö(test¸¦ ÅëÇÏ¿©)¿¡ ´ëÇØ ÁÖ¸ñÇϱ⠹ٶõ´Ù. À̰ÍÀº ´Ù¸¥ ÆäÀÌÁö¸¦
"ÇÒ´ç"(committing)Çϱâ Àü¿¡ ½ºÅÃÀÇ ¹Ù´ÚÀ» Æ÷ÇÔÇÏ´Â ÆäÀÌÁö°¡ commit µÇ´Â °ÍÀ» º¸ÁõÇØÁØ´Ù.
¾Æ·¡ÀÇ ³»¿ëÀ» Àо¸é
"°¢°¢ÀÇ »õ·Î¿î ¾²·¹µå´Â commit µÇ°í ¿¹¾àµÈ ¸Þ¸ð¸®·Î ±¸¼ºµÈ ÀÚ±â ÀÚ½ÅÀÇ ½ºÅà °ø°£À» ¹Þ´Â´Ù. ±âº»
°ªÀ¸·Î °¢ ¾²·¹µå´Â 1MbÀÇ ¿¹¾àµÈ ¸Þ¸ð¸®¿Í ÇÑ ÆäÀÌÁöÀÇ commit µÈ ¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÑ´Ù. ½Ã½ºÅÛÀº ÇÊ¿äÇÒ ¶§ ¿¹¾àµÈ
½ºÅà ¸Þ¸ð¸®¿¡¼ ÇÑ ÆäÀÌÁö ºí·ÏÀ» commit ÇÒ °ÍÀÌ´Ù."(MSDN CreateThread > dwStackSize >
"Thread Stack Size" ÂüÁ¶).
/Gs¿¡ °üÇÑ ¹®¼¿¡¼ ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÀÀ¿ëÇÁ·Î±×·¥°ú À©µµ¿ìÁî NT °¡»ó ¸Þ¸ð¸® ¸Å´ÏÀú »çÀÌ¿¡¼ ÁÖÀÇ ±í°Ô Á¶ÀýµÇ´Â »óÈ£
ÀÛ¿ëÀ» Çã¿ëÇØÁÖ´Â stack probe¸¦ °¡Áø´Ù´Â ¸»À» Çß´ÂÁö°¡ ºÐ¸íÇØÁú °ÍÀÌ´Ù.
ÀÌÁ¦ ¿ì¸®ÀÇ ThreadFunc¿Í 4kb Á¦ÇÑ¿¡ °üÇÑ ³íÁ¡À¸·Î µÇµ¹¾Æ°¡ÀÚ.
ºñ·Ï ¿ì¸®´Â /Gs ¿É¼ÇÀ¸·Î stack probe ·çƾ¿¡ ´ëÇÑ È£ÃâÀ» ¿¹¹æÇÒ ¼ö ÀÖÁö¸¸ ±× ¹®¼´Â ¿ì¸®°¡ ±×·¸°Ô ÇÏ´Â °Í¿¡ ´ëÇØ
°æ°í¸¦ Çϰí ÀÖ´Ù. °Ô´Ù°¡ ±× ¹®¼´Â #pragma check_stack Áö½ÃÀÚ¸¦ ÀÌ¿ëÇϸé stack
probe ±â´ÉÀ» ÄѰ¡³ª ²ø ¼ö ÀÖ´Ù°í ¸»Çϰí ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ pragma´Â stack probe¿¡ ÀüÇô
¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â µíÇÏ´Ù(±× ¹®¼°¡ À߸ø µÇ¾úµçÁö ÇÊÀÚ°¡ ´Ù¸¥ ¾î¶² »ç½ÇµéÀ» À߸ø ¾È °ÍÀ̰ÚÁö¸¸). ¾î·µç CreateRemoteThread¿Í WriteProcessMemory Å×Å©´ÐÀÌ ÀÛÀº ÄÚµå
Á¶°¢µéÀ» ÁÖÀÔÇÒ ¶§¸¸ ÀÌ¿ëµÈ´Ù´Â °ÍÀ» »ó±âÇÑ´Ù¸é ¿ì¸®ÀÇ Áö¿ª º¯¼ö´Â ±â²¯ÇØ¾ß ¸î ¹ÙÀÌÆ® ÀÌ»óÀ» *¼Ò¸ð*ÇÏÁö ¾ÊÀ» °ÍÀÌ¸ç °ÅÀÇ
4kb °æ°è¿¡ ±ÙÁ¢ÇÒ ÀÏÀº ¾øÀ» °ÍÀÌ´Ù.
-
E) ¾î°¼ ÇÊÀÚ´Â 3°³º¸´Ù ¸¹Àº case ¹®À» °¡Áø ¿ì¸®ÀÇ switch
ºí·ÏÀ» ºÐÇÒÇØ¾ß Çߴ°¡?
- ¹Ýº¹ÇÏÁö¸¸ ¿¹Á¦·Î ¼³¸íÇÏ´Â °ÍÀÌ °¡Àå ½±´Ù. ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ »ìÆìº¸ÀÚ.
int Dummy( int arg1 )
{
int ret =0;
switch( arg1 ) {
case 1: ret = 1; break;
case 2: ret = 2; break;
case 3: ret = 3; break;
case 4: ret = 0xA0B0; break;
}
return ret;
}
À̰ÍÀº ¾Æ·¡¿Í À¯»çÇÏ°Ô ÄÄÆÄÀÏ µÉ °ÍÀÌ´Ù.
Address OpCode/Params Decoded instruction
--------------------------------------------------
:00401000 8B4C2404 mov ecx, dword ptr [esp+04]
:00401004 33C0 xor eax, eax
:00401006 49 dec ecx
:00401007 83F903 cmp ecx, 00000003
:0040100A 771E ja 0040102A
:0040100C FF248D2C104000 jmp dword ptr [4*ecx+0040102C]
:00401013 B801000000 mov eax, 00000001
:00401018 C3 ret
:00401019 B802000000 mov eax, 00000002
:0040101E C3 ret
:0040101F B803000000 mov eax, 00000003
:00401024 C3 ret
:00401025 B8B0A00000 mov eax, 0000A0B0
:0040102A C3 ret
:0040102B 90 nop
:0040102C 13104000 DWORD 00401013
:00401030 19104000 DWORD 00401019
:00401034 1F104000 DWORD 0040101F
:00401038 25104000 DWORD 00401025
switch-case°¡ ¾î¶»°Ô ±¸ÇöµÇ´ÂÁö¿¡ ÁÖ¸ñÇϱ⠹ٶõ´Ù.
¸ðµç ´ÜÀÏ case
¹®À» µ¶¸³ÀûÀ¸·Î °Ë»çÇϱ⺸´Ù´Â ÁÖ¼Ò Å×À̺íÀÌ »ý¼ºµÈ´Ù. ±×·± ÈÄ ÁÖ¼Ò Å×ÀÌºí¿¡ ´ëÇÑ ¿ÀÇÁ¼ÂÀ» °£´ÜÇÏ°Ô °è»êÇÔÀ¸·Î½á ¿Ã¹Ù¸¥ case·Î
Á¡ÇÁÇÑ´Ù. Àß »ý°¢Çغ¸¸é À̰ÍÀº »ç½Ç»ó ±â´É °³¼±À̶ó°í ÇÒ ¼ö ÀÖ´Ù. 50°³ÀÇ case ¹®À» °¡Áø switch ¹®À» °¡Áö°í ÀÖ´Ù°í »ó»óÇØº¸ÀÚ. À§ÀÇ Æ®¸¯ÀÌ ¾ø´Ù¸é ¸¶Áö¸· case¿¡ µµ´ÞÇϱâ À§ÇØ 50°³ÀÇ CMP¿Í JMP
¸í·É¾îÄڵ带 ½ÇÇàÇØ¾ß ÇÑ´Ù. ¹Ý¸é ÁÖ¼Ò Å×À̺íÀÌ ÀÖÀ¸¸é ÇÑ ¹øÀÇ Å×À̺í look-upÀ¸·Î ¾î¶°ÇÑ case¿¡¶óµµ Á¡ÇÁ ÇÒ ¼ö ÀÖ´Ù. ÄÄÇ»ÅÍ ¾Ë°í¸®Áò°ú time
complexityÀÇ ¿ë¾î·Î ¸»ÇÏÀÚ¸é ¿ì¸®´Â O(2n)
¾Ë°í¸®ÁòÀ» O(5) ¾Ë°í¸®ÁòÀ¸·Î ´ëüÇÑ °ÍÀÌ´Ù. ¿©±â¿¡¼
- O´Â ÃÖ¾ÇÀÇ °æ¿ìÀÇ time complexity¸¦ ³ªÅ¸³½´Ù.
- ¿ÀÇÁ¼ÂÀ» °è»êÇϰí Å×À̺í look-upÀ» Çϰí ÃÖÁ¾ÀûÀ¸·Î ÀûÀýÇÑ ÁÖ¼Ò·Î Á¡ÇÁÇϱâ±îÁö 5°³ÀÇ ¸í·É¾îÄÚµå¸é ÃæºÐÇÏ´Ù°í
°¡Á¤Çß´Ù.
±×·±µ¥ À§ÀÇ »óȲÀº
case »ó¼öµéÀÌ ¿¬¼ÓÀûÀ¸·Î(1, 2, 3, 4)
ÁÖÀÇ ±í°Ô ¼±ÅõǾú±â ¶§¹®¿¡ °¡´ÉÇÑ °ÍÀ̶ó°í »ý°¢ÇÏ´Â »ç¶÷µµ ÀÖÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÙÇàÈ÷µµ µ¿ÀÏÇÑ ÇØ°áÃ¥ÀÌ ´ëºÎºÐÀÇ Çö½Ç »ýȰÀÇ
¿¹Á¦¿¡µµ Àû¿ëµÉ ¼ö ÀÖ´Ù´Â °ÍÀÌ ÆÇ¸íµÇ¾ú´Ù. ´ÜÁö ¿ÀÇÁ¼Â °è»ê¸¸ÀÌ ¾à°£ ´õ º¹ÀâÇØÁú »ÓÀÌ´Ù. ÇÏÁö¸¸ ¿©±â¿¡´Â µÎ °¡ÁöÀÇ ¿¹¿Ü°¡
ÀÖ´Ù.
- 3°³º¸´Ù ÀûÀº
case ¹®ÀÌ Àְųª
-
case »ó¼öµéÀÌ ¼·Î ÀüÇô °ü°è°¡ ¾ø´Ù¸é(¿¹. "case 1", "case 13", "case 50" °ú "case 1000")
°á°úÀûÀÎ ÄÚµå´Â ¸ðµç ´ÜÀÏ case »ó¼ö¸¦ CMP¿Í JMP
¸í·É¾îÄڵ带 °¡Áö°í °¢°¢ Á¶»çÇÏ´Â ±ä °úÁ¤À» °ÅÄ£´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼ °á°úÀûÀÎ ÄÚµå´Â ¿ì¸®°¡ Á¤»óÀûÀÎ if-else if
½ÃÄö½º¸¦ ÀÌ¿ëÇßÀ» °æ¿ì¿Í º»ÁúÀûÀ¸·Î µ¿ÀÏÇÏ´Ù.
Èï¹Ì·Î¿î Á¡ : ¾î¶² ÀÌÀ¯·Î »ó¼ö Ç¥Çö ½Ä¸¸ÀÌ case ¹®À» µ¿¹ÝÇÒ ¼ö ÀÖ´ÂÁö ÀǾÆÇÏ°Ô »ý°¢Çß´ø ÀûÀÌ ÀÖ´Ù¸é ±× ÀÌÀ¯¸¦
ÀÌÁ¦ ¾Ë¾ÒÀ» °ÍÀÌ´Ù. ÁÖ¼Ò Å×À̺íÀ» »ý¼ºÇϱâ À§ÇØ ÀÌ °ªÀº ¸í¹éÈ÷ ÄÄÆÄÀÏ ½Ã¿¡ ¾Ë·ÁÁ®¾ß Çϱ⠶§¹®ÀÌ´Ù.
´Ù½Ã ¹®Á¦·Î µÇµ¹¾Æ°¡ÀÚ!
ÁÖ¼Ò 0040100CÀÇ JMP ¸í·É¾îÄڵ忡 ÁÖ¸ñÇϱ⠹ٶõ´Ù. 16Áø opcode FF¿¡
´ëÇØ ÀÎÅÚÀÇ ¹®¼°¡ ¹¹¶ó°í Çß´ÂÁö¸¦ »ìÆìº¸ÀÚ.
Opcode Instruction Description
FF /4 JMP r/m32 Jump near, absolute indirect,
address given in r/m32
¾Æ! ¹®Á¦ÀÇ JMP´Â ÀÏÁ¾ÀÇ absolute addressingÀ» ÀÌ¿ëÇÑ´Ù. ´Ù¸¥ ¸»·Î Ç¥ÇöÇØ¼
operand Áß Çϳª(¿ì¸®ÀÇ °æ¿ì 0040102C)°¡ Àý´ë ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù. ´õ ÀÌ»ó ¸»ÇÒ Çʿ䰡
ÀÖÀ»±î? ÀÌÁ¦ ¿ø°Ý ThreadFunc´Â ÀÚ½ÅÀÇ switch¸¦
À§ÇÑ ÁÖ¼Ò Å×À̺íÀº
0040102C¿¡ ÀÖ´Ù°í ¸Í¸ñÀûÀ¸·Î »ý°¢ÇÒ °ÍÀ̰í À߸ø µÈ Àå¼Ò·Î JMP ÇÏ¿©
È¿°úÀûÀ¸·Î ¿ø°Ý ÇÁ·Î¼¼½º¸¦ crash ÇÒ °ÍÀÌ´Ù.
-
F) µµ´ëü ¾î°¼ ¿ø°Ý ÇÁ·Î¼¼½º°¡ crash Çϴ°¡?
- ¿ì¸®ÀÇ ¿ø°Ý ÇÁ·Î¼¼½º°¡ crash µÈ´Ù¸é À̰ÍÀº Ç×»ó ¾Æ·¡ ¿øÀÎ Áß Çϳª¿¡ ÀÇÇØ ÀϾ °ÍÀÌ´Ù.
-
ThreadFunc ³»ºÎ¿¡¼ Á¸ÀçÇÏÁö ¾Ê´Â stringÀ» ÂüÁ¶Çß´Ù.
-
ThreadFuncÀÇ Çϳª ÀÌ»óÀÇ ¸í·É¾îÄڵ尡 absolute addressingÀ» ÀÌ¿ëÇÑ´Ù(¿¹·Î¼ Appendix
E ÂüÁ¶).
ThreadFunc°¡ Á¸ÀçÇÏÁö ¾Ê´Â ÇÔ¼ö¸¦ È£ÃâÇß´Ù(ÀÌ È£ÃâÀº ÄÄÆÄÀÏ·Î/¸µÄ¿¿¡ ÀÇÇØ Ãß°¡µÇ¾úÀ»
¼ö ÀÖ´Ù). ÀÌ·² °æ¿ì ThreadFunc¸¦ µð½º¾î¼Àºí·¯·Î º¸¸é ¾Æ·¡¿Í °°Àº °ÍÀ» º¼ ¼ö ÀÖÀ»
°ÍÀÌ´Ù. :004014C0 push EBP
:004014C1 mov EBP, ESP
...
:004014C5 call 0041550
...
:00401502 ret
¹®Á¦ÀÇ CALLÀÌ ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ Ãß°¡µÈ °ÍÀ̶ó¸é(/GZ¿Í °°Àº "±ÝÁöµÈ" ½ºÀ§Ä¡°¡ ÄÑÁ® ÀÖ¾ú±â
¶§¹®¿¡) À̰ÍÀº
ThreadFuncÀÇ ½ÃÀÛ ºÎºÐÀ̳ª °ÅÀÇ ³¡ ÁöÁ¡ÀÇ ¾îµò°¡¿¡ À§Ä¡ÇÒ °ÍÀÌ´Ù.
¾î·µç CreateRemoteThread¿Í WriteProcessMemory Å×Å©´ÐÀ» ÀÌ¿ëÇÒ
¶§¿¡´Â ¸Å¿ì ÁÖÀÇÇØ¾ß ÇÑ´Ù. ƯÈ÷ ÄÄÆÄÀÏ·¯/¸µÄ¿ ¿É¼ÇÀ» °üÂûÇØ¾ß ÇÑ´Ù. À̵éÀº ¿ì¸®ÀÇ
ThreadFunc¿¡ ¹«¾ùÀΰ¡¸¦ ½±°Ô Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
Âü°í ¹®¼ :
- Load Your
32-bit DLL into Another Process's Address Space Using INJLIB by
Jeffrey Richter. MSJ May, 1994
- HOWTO:
Subclass a Window in Windows 95; Microsoft Knowledge Base Article -
125680
- Tutorial 24:
Windows Hooks by Iczelion
- CreateRemoteThread
by Felix Kasza
- API hooking
revealed by Ivo Ivanov
- Peering
Inside the PE: A Tour of the Win32 Portable Executable File Format
by Matt Pietrek, March 1994
- Intel
Architecture Software Developer's Manual, Volume 2: Instruction Set
Reference
¹®¼ history
- July 25, 2003: Article published
- August 19, 2003: Applied only some minor formatting changes