Gerente de Control de Servicios


Service Control Manager ( SCM ) es un proceso de sistema especial bajo la familia de sistemas operativos Windows NT , que inicia, detiene e interactúa con los procesos de servicio de Windows . [1] Se encuentra en el ejecutable. Los procesos de servicio interactúan con SCM a través de una API bien definida , y las herramientas interactivas de administración de servicios de Windows, como el complemento MMC y la utilidad de control de servicios de línea de comandos, utilizan internamente la misma API . Terminar este archivo se usa como un método para causar la pantalla azul de la muerte .%SystemRoot%\System32\services.exeServices.mscsc.exe

El ejecutable de SCM, Services.exe, se ejecuta como un programa de consola de Windows y lo inicia el proceso Wininit al inicio del sistema . [2] Su función principal, SvcCtrlMain(), lanza todos los servicios configurados para el inicio automático. Primero, se inicializa una base de datos interna de los servicios instalados leyendo las dos claves de registro siguientes:

En el siguiente paso, la función principal de SCM SvcCtrlMain()llama a la función ScGetBootAndSystemDriverState()que verifica si los controladores de dispositivos que deben iniciarse durante el inicio o el inicio del sistema se cargaron correctamente, y aquellos que no lo hicieron se almacenan en una lista llamada ScFailedDrivers. Luego, se crea una canalización con nombre como una interfaz de llamada de procedimiento remoto entre el SCM y los SCP (procesos de control de servicios) que interactúan con servicios específicos.\Pipe\Ntsvcs

A continuación, llama a la ScAutoStartServices()función que recorre todos los servicios marcados como inicio automático, prestando atención a las dependencias de orden de carga calculadas. En caso de dependencia circular, se anota un error y se omite el servicio que depende de un servicio que pertenece a un grupo que viene más tarde en el orden de carga. Para los servicios de inicio automático demorado, la agrupación no tiene efecto y se cargan en una etapa posterior del inicio del sistema. [5]

Para cada servicio que desea iniciar, el SCM llama a la ScStartService()función que verifica el nombre del archivo que ejecuta el proceso del servicio, asegurándose de que la cuenta especificada para el servicio sea la misma que la cuenta en la que se ejecuta el proceso del servicio. Cada servicio que lo hace no se ejecuta en la Systemcuenta se inicia sesión llamando a la función LSASSLogonUserEx() , para lo cual el proceso LSASS busca contraseñas "secretas" almacenadas en la HKLM\SECURITY\Policy\Secrets\clave de registro, que fueron almacenadas por el SCP usando la LsaStorePrivateData()API, cuando el servicio se configuró originalmente. [6]

A continuación, ScLogonAndStartImage()se llama a la función para cada servicio cuyo proceso de servicio aún no se haya iniciado. Los procesos de servicio se crean en un estado suspendido a través de la CreateProcessAsUser()API. Antes de que se reanude la ejecución del proceso de servicio, se crea una canalización con nombre \Pipe\Net\NtControlPipeX(donde X es un número incrementado para cada iteración del servicio) que sirve como canal de comunicación entre el SCM y el proceso de servicio. El proceso de servicio se conecta a la canalización llamando a la StartServiceCtrlDispatcher()función, después de lo cual el SCM envía al servicio un comando de "inicio". [7]