Gerente de Control de Servicios


Service Control Manager ( SCM ) es un proceso de sistema especial de 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 la misma API es utilizada internamente por 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 . La eliminación de este archivo se utiliza como método para provocar la pantalla azul de la muerte .%SystemRoot%\System32\services.exeServices.mscsc.exe

El ejecutable de SCM, Services.exese ejecuta como un programa de consola de Windows y el proceso Wininit lo inicia al principio del 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 dispositivo que deben iniciarse durante el arranque o el inicio del sistema se cargaron exitosamente, 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 a 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 calculadas del orden de carga. En caso de una dependencia circular, se observa un error y se omite el servicio que depende de un servicio que pertenece a un grupo que viene más adelante en el orden de carga. Para los servicios de inicio automático retrasado, la agrupación no tiene ningún 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, asegurando 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 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 tubería llamando a la StartServiceCtrlDispatcher()función, después de lo cual el SCM envía al servicio un comando de "inicio". [7]