⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 创建svchost_exe调用的服务原理与实践.htm

📁 创建SvcHost_exe调用的服务原理与实践
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      DllMain called DLL_THREAD_ATTACH");<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      DLL_THREAD_DETACH:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      DllMain called DLL_THREAD_DETACH");<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      DLL_PROCESS_DETACH:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_STOP_PENDING, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1500);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_STOPPED, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      DllMain called 
      DLL_PROCESS_DETACH");<BR>#endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 
      TRUE;<BR>}<BR><BR><BR>void __stdcall ServiceMain( int argc, wchar_t* 
      argv[] 
      )<BR>{<BR>//&nbsp;&nbsp;&nbsp;&nbsp;DebugBreak();<BR>&nbsp;&nbsp;&nbsp;&nbsp;char 
      svcname[256];<BR>&nbsp;&nbsp;&nbsp;&nbsp;strncpy(svcname, (char*)argv[0], 
      sizeof svcname); //it's should be unicode, but if it's ansi we do it 
      well<BR>&nbsp;&nbsp;&nbsp;&nbsp;wcstombs(svcname, argv[0], sizeof 
      svcname);<BR>&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceMain(%d, %s) called", argc, 
      svcname);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hSrv = 
      RegisterServiceCtrlHandler( svcname, (LPHANDLER_FUNCTION)ServiceHandler 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( hSrv == NULL 
      )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      RegisterServiceCtrlHandler %S failed", 
      argv[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}else 
      FreeConsole();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_START_PENDING, 0, 1 );<BR>&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_RUNNING, 0, 0 );<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// call Real 
      Service function noew<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(argc &gt; 
      1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(svcname, 
      (char*)argv[1], sizeof 
      svcname),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcstombs(svcname, 
      argv[1], sizeof svcname);<BR>&nbsp;&nbsp;&nbsp;&nbsp;RealService(argc &gt; 
      1 ? svcname : MY_EXECUTE_NAME, argc &gt; 2 ? 1 : 
      0);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;do{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(10);//not 
      quit until receive stop command, otherwise the service will 
      stop<BR>&nbsp;&nbsp;&nbsp;&nbsp;}while(dwCurrState != SERVICE_STOP_PENDING 
      &amp;&amp; dwCurrState != 
      SERVICE_STOPPED);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceMain done");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>}<BR><BR>int 
      TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress 
      )<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SERVICE_STATUS 
      srvStatus;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwServiceType = 
      SERVICE_WIN32_OWN_PROCESS;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwCurrentState 
      = dwCurrState = 
      dwState;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwControlsAccepted = 
      SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | 
      SERVICE_ACCEPT_SHUTDOWN;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwWin32ExitCode 
      = 
      dwExitCode;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwServiceSpecificExitCode 
      = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwCheckPoint = 
      dwProgress;<BR>&nbsp;&nbsp;&nbsp;&nbsp;srvStatus.dwWaitHint = 
      3000;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return SetServiceStatus( hSrv, 
      &amp;srvStatus );<BR>}<BR><BR>void __stdcall ServiceHandler( DWORD 
      dwCommand )<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// not really necessary 
      because the service stops quickly<BR>&nbsp;&nbsp;&nbsp;&nbsp;switch( 
      dwCommand )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      SERVICE_CONTROL_STOP:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_STOP_PENDING, 0, 1 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceHandler called 
      SERVICE_CONTROL_STOP");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(10);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_STOPPED, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      SERVICE_CONTROL_PAUSE:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_PAUSE_PENDING, 0, 1 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceHandler called 
      SERVICE_CONTROL_PAUSE");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_PAUSED, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      SERVICE_CONTROL_CONTINUE:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_CONTINUE_PENDING, 0, 1 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceHandler called 
      SERVICE_CONTROL_CONTINUE");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_RUNNING, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      SERVICE_CONTROL_INTERROGATE:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceHandler called 
      SERVICE_CONTROL_INTERROGATE");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      dwCurrState, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;case 
      SERVICE_CONTROL_SHUTDOWN:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      ServiceHandler called 
      SERVICE_CONTROL_SHUTDOWN");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TellSCM( 
      SERVICE_STOPPED, 0, 0 
      );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR><BR>//RealService 
      just create a process <BR>int RealService(char *cmd, int 
      bInteract)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      RealService called '%s' %s", cmd, bInteract ? "Interact" : 
      "");<BR>&nbsp;&nbsp;&nbsp;&nbsp;STARTUPINFO si = 
      {0};<BR>&nbsp;&nbsp;&nbsp;&nbsp;PROCESS_INFORMATION 
      pi;<BR>&nbsp;&nbsp;&nbsp;&nbsp;si.cb = sizeof 
      si;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(bInteract) si.lpDesktop = 
      "WinSta0\\Default"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!CreateProcess(NULL, 
      cmd, NULL, NULL, false, 0, NULL, NULL, &amp;si, 
      &amp;pi))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("SvcHostDLL: 
      CreateProcess(%s) error:%d", cmd, 
      GetLastError());<BR>&nbsp;&nbsp;&nbsp;&nbsp;else OutputString("SvcHostDLL: 
      CreateProcess(%s) to %d", cmd, 
      pi.dwProcessId);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 
      0;<BR>}<BR><BR><BR>int InstallService(char 
      *name)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Open a handle to the SC Manager 
      database. <BR>&nbsp;&nbsp;&nbsp;&nbsp;int rc = 
      0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;HKEY hkRoot = HKEY_LOCAL_MACHINE, hkParam = 
      0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SC_HANDLE hscm = NULL, schService = 
      NULL;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;char 
      buff[500];<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *svcname = 
      DEFAULT_SERVICE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(name &amp;&amp; name[0]) 
      svcname = name;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//query svchost 
      setting<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *ptr, *pSvchost = 
      "SOFTWARE\\Microsoft\\Windows 
      NT\\CurrentVersion\\Svchost";<BR>&nbsp;&nbsp;&nbsp;&nbsp;rc = 
      RegOpenKeyEx(hkRoot, pSvchost, 0, KEY_QUERY_VALUE, 
      &amp;hkRoot);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(ERROR_SUCCESS != 
      rc)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("RegOpenKeyEx(%s) 
      KEY_QUERY_VALUE error %d.", pSvchost, rc); 
      <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw 
      "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD 
      type, size = sizeof buff;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rc = 
      RegQueryValueEx(hkRoot, "netsvcs", 0, &amp;type, (unsigned char*)buff, 
      &amp;size);<BR>&nbsp;&nbsp;&nbsp;&nbsp;RegCloseKey(hkRoot);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SetLastError(rc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(ERROR_SUCCESS 
      != rc)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw 
      "RegQueryValueEx(Svchost\\netsvcs)";<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;for(ptr 
      = buff; *ptr; ptr = strchr(ptr, 
      0)+1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(stricmp(ptr, 
      svcname) == 0) break;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if(*ptr == 
      0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString("you 
      specify service name not in Svchost\\netsvcs, must be one of following:"); 
      <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(ptr = buff; *ptr; 
      ptr = strchr(ptr, 
      0)+1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputString(" 
      - %s", ptr); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw 
      "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//install 
      service<BR>&nbsp;&nbsp;&nbsp;&nbsp;hscm = OpenSCManager(NULL, NULL, 
      SC_MANAGER_ALL_ACCESS);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hscm == NULL) 
      <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw 
      "OpenSCManager()";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char 
      *bin = "%SystemRoot%\\System32\\svchost.exe -k 
      netsvcs";<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;schService = CreateService( 
      <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hscm,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 
      SCManager database 
      <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svcname,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -