- °³¿ä
- µÎ°¡Áö ¸ðµå·Î ½ÇÇàÇϱâ
- ¼ºñ½º °èÁ¤
- ¸µÅ©
1 °³¿ä
À©µµ¿ìÁî°èÀÇ µ¥¸ó(daemon). Áï ¹é±×¶ó¿îµå¿¡¼ Ç×»ó ¶°ÀÖÀ¸¸é¼ ´Ù¸¥ ÇÁ·Î±×·¥ ¶Ç´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ó¸®ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. Áï Ŭ¶óÀÌ¾ðÆ®º¸´Ù´Â ¼¹ö Âʰú °ü·ÃÀÌ ±í´Ù.
ÀϹÝÀûÀÎ ÇÁ·Î±×·¥°úÀÇ Â÷ÀÌ´Â ´ë° ´ÙÀ½°ú °°´Ù.
- ±âº»ÀûÀ¸·Î GUI¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. (¿ÏÀüÈ÷ »ç¿ëÇÒ ¼ö ¾ø´Â °ÍÀº ¾Æ´Ï´Ù.)
- ½Ã½ºÅÛ¿¡ »ç¿ëÀÚ°¡ ·Î±×ÀÎÇÏÁö ¾ÊÀº »óÅ¿¡¼µµ ½ÇÇàÀÌ °¡´ÉÇÏ´Ù.
- Å©·¡½ÃµÈ °æ¿ì ½ÇÇàÇÒ ÇൿÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
- SCM(Service Control Manager)°úÀÇ Åë½ÅÀ» ÅëÇØ, ½ÇÇàÀ» ½ÃÀÛ/ÁßÁö/ÀϽÃÁßÁö/°è¼ÓÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ ÀÖ´Â ¼ºñ½º¸¦ ½ÇÇàÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.
2 µÎ°¡Áö ¸ðµå·Î ½ÇÇàÇϱâ
ÇϳªÀÇ ½ÇÇà ÆÄÀÏÀ» ¾î¿ ¶§´Â ±×³É Ä¿¸Çµå ¶óÀÎ ÇÁ·Î±×·¥À¸·Î, ¾î¿ ¶§´Â ¼ºñ½º·Î ½ÇÇàÇϱ⿡ °üÇÑ ³»¿ëÀÌ´Ù.
ÀÏ´Ü ½ÇÁ¦ ¸ÞÀÎ ·çÇÁ°¡ µé¾î°¡´Â ÇÔ¼ö¸¦ µû·Î ºÐ¸®ÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ usermain ÇÔ¼ö¶ó°í ÇÏÀÚ.
±× ´ÙÀ½ Ä¿¸Çµå ¶óÀÎ Àμö¸¦ ÀÌ¿ëÇØ ÀÏ¹Ý ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇÒ °ÍÀÎÁö, ¾Æ´Ï¸é ¼ºñ½º·Î ½ÇÇàÇÒ °ÍÀÎÁöÀÇ ¿©ºÎ¸¦ ¾Ë¾Æ³½´Ù. ÀÏ¹Ý ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇÑ´Ù¸é usermain ÇÔ¼ö¸¦ ±×³É È£ÃâÇØÁÖ¸é µÈ´Ù. ¼ºñ½º·Î ½ÇÇàÇÑ´Ù¸é, RegisterServiceCtrlHandlerEx È£Ãâ ÈÄ¿¡, StartServiceCtrlDispatcher ÇÔ¼ö¿¡ ³Ñ±â´Â ±¸Á¶Ã¼¿¡´Ù°¡ usermain ÇÔ¼ö Æ÷ÀÎÅÍ ÁÖ¼Ò¸¦ ä¿ö³ÖÀ¸¸é µÈ´Ù.
µð¹ö±ëÀÇ ÆíÀ̼ºÀ» À§ÇØ, ÄÜ¼Ö Ã³¸®¸¦ ÇØÁØ´Ù. Áï ÀÏ¹Ý ÇÁ·Î±×·¥ÀÏ °æ¿ì¿¡´Â Ç¥ÁØÃâ·Â(stdout)À» »ç¿ëÇϰí, ¼ºñ½ºÀÏ °æ¿ì¿¡´Â ¸í½ÃÀûÀ¸·Î ÄܼÖÀ» ÇÒ´çÇØ¼ »ç¿ëÇϵµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. ÀÌ ÄܼÖÀº ¼ºñ½º°¡ SERVICE_INTERACTIVE_PROCESS ¼Ó¼ºÀ» °¡Áö°í ÀÖ¾î¾ß¸¸ º¸ÀδÙ. ¼Ó¼ºÀ» ¼³Á¤ÇØÁÖÁö ¾ÊÀ¸¸é º¸ÀÌÁöµµ ¾Ê´Â °¡»óÀÇ ½ºÅ×À̼ǿ¡ ÄܼÖÀÌ ¶°ÀÖ°Ô µÈ´Ù.
extern HANDLE g_hConsole; // ÄÜ¼Ö ÇÚµé
...
// ÄÜ¼Ö ÃʱâÈÇϱâ
void InitConsole()
{
// ÀÏ¹Ý ÄÜ¼Ö ¸ðµå ÇÁ·Î±×·¥, Áï ÄܼÖÀÌ ÀÌ¹Ì Á¸ÀçÇÏ´Â ÇÁ·Î±×·¥À̶ó¸é,
// AllocConsole ÇÔ¼ö´Â ½ÇÆÐÇÑ´Ù. ±×·¯³ª ¼º°ø/½ÇÆÐ ¿©ºÎ´Â º° »ó°ü ¾ø´Ù.
// »õ·Î »ý¼ºÇÑ ÄܼÖÀÌ°Ç ¿ø·¡ ÀÖ´ø ÄܼÖÀÌ°Ç GetStdHandle ÇÔ¼ö È£ÃâÀ»
// ÅëÇØ ÇÚµéÀ» ¾ò¾î¿Ã ¼ö Àֱ⠶§¹®ÀÌ´Ù.
::AllocConsole();
g_hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
}
// Äֿܼ¡ Ãâ·ÂÇϱâ
void WriteToConsole(const char* buf)
{
if (g_hConsole != INVALID_HANDLE_VALUE)
{
DWORD dwBytes = 0;
::WriteFile(g_hConsole, buf, (DWORD)::strlen(buf), &dwBytes, NULL);
}
else
{
std::cout << buf;
}
} °¡Àå °£´ÜÇÑ ÄÜ¼Ö Ãâ·Â, ½ÇÁ¦·Î´Â ½º·¹µå ¹®Á¦¸¦ °í·ÁÇØÁà¾ß ÇÑ´Ù.
3 ¼ºñ½º °èÁ¤
¼ºñ½º´Â µû·Î ¼³Á¤ÇØÁÖÁö ¾Ê´Â ÀÌ»ó ±âº»ÀûÀ¸·Î "Local System" °èÁ¤À¸·Î ½ÇÇàµÇ´Âµ¥, ÀÌ ³ÑÀº ¸î°¡Áö Á¦ÇÑ »çÇ×À» °¡Áö°í ÀÖ´Ù.
- HKEY_CURRENT_USER ¹ØÀÇ ·¹Áö½ºÆ®¸®´Â ¾×¼¼½ºÇϱⰡ ¾Ö¸Å¸ðÈ£ÇÏ´Ù. ±âº» ÇÁ·ÎÆÄÀÏ °ªÀ» »ç¿ëÇÏ°Ô µÇ´Âµ¥, ±×³É ¼ÓÆíÇÏ°Ô HKEY_LOCAL_MACHINEÀ» »ç¿ëÇÏ´Â °ÍÀÌ ³´´Ù.
- ·£¿¡ ¿¬°áµÇ¾î ÀÖ´Â ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ Á¢±ÙÇϱⰡ ¾î·Æ´Ù. ·ÎÄà ½Ã½ºÅÛ °èÁ¤Àº ÀÚ½ÅÀÇ ÄÄÇ»ÅÍ¿¡¼´Â "Users" ±×·ì°ú °°Àº ±ÇÇÑÀ» °¡ÁöÁö¸¸, ³×Æ®¿öÅ©·Î ³ª°¡¸é ³Î ¼¼¼ÇÀ» »ç¿ëÇÏ°Ô µÈ´Ù. ³Î ¼¼¼ÇÀº credentialÀÌ ÀüÇô ¾ø´Â ¼¼¼ÇÀÌ´Ù. À©µµ¿ìÁî º¸¾È ÂÊÀ¸·Î ÀÚ¼¼È÷ ¸ð¸£´Â °ü°è·Î credentialÀÌ Á¤È®ÇÏ°Ô ¹ºÁö´Â Àß ¸ð¸£°Ú´Ù¸¸, Áß¿äÇÑ °Ç ÀÏ´Ü ³×Æ®¿öÅ©·Î ³ª°¡¸é ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼´Â guest Á¤µµ Ãë±ÞÀ̶ó´Â °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¿©·¯ Á¦¾à »çÇ×À» ÇÇÇϱâ À§Çؼ´Â ¼ºñ½º ½ÇÇà °èÁ¤À» ¾ÖÃÊ¿¡ ÁöÁ¤ÇØÁְųª, impersonationÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ¼ºñ½º °èÁ¤ ÁöÁ¤ÇÏ´Â °Å¾ß ¼ºñ½º ½º³ÀÀο¡¼ ó¸®Çϰųª, sc °°Àº ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ µî·ÏÇØÁÖ¸é µÇ°í, impersonationÀº ´ëÃæ ¾Æ·¡¿Í °°Àº Äڵ带 ÅëÇØ ó¸®ÇÒ ¼ö ÀÖ´Ù.
bool ImpersonateUser(LPCTSTR user, LPCTSTR domain, LPCTSTR password)
{
HANDLE token = NULL;
HANDLE duplicated = NULL;
if (!LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &token))
return false;
if (!DuplicateToken(token, SecurityImpersonation, &duplicated))
{
CloseHandle(token);
return false;
}
if (!ImpersonateLoggedOnUser(duplicated))
{
CloseHandle(token);
CloseHandle(duplicated);
return false;
}
CloseHandle(token);
CloseHandle(duplicated);
return true;
} Access Control ºÎºÐÀº ÀÚ¼¼È÷ ¾Æ´Â °ÍÀÌ ¾Æ´Ï¶ó, ÀÌ Äڵ尡 ¸Â´Â °ÇÁö´Â Àß ¸ð¸£°Ú´Ù¸¸, Å×½ºÆ®Çغ¸´Ï µ¹¾Æ°¡±ä ÇÑ´Ù.
4 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)