Evite que se mate el proceso de usuario con “End Process” desde Process Explorer

Noté que GoogleToolbarNotifier.exe no se puede matar desde Process Explorer. Devuelve “Acceso denegado”. Se ejecuta como usuario, ejecuta la prioridad “Normal” y se ejecuta desde Archivos de progtwig.

¿Cómo lo hicieron?

Creo que podría haber una manera de modificar la ACL, o marcar el proceso como ‘crítico’, pero parece que no puedo encontrar nada.

Actualizar:

Encontré la respuesta con una buena búsqueda. @Alex K. tenía razón en que se quitó el permiso PROCESS_TERMINATE para el proceso, pero quería proporcionar la respuesta en código:

static const bool ProtectProcess() { HANDLE hProcess = GetCurrentProcess(); EXPLICIT_ACCESS denyAccess = {0}; DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL; BuildExplicitAccessWithName( &denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE ); PACL pTempDacl = NULL; DWORD dwErr = 0; dwErr = SetEntriesInAcl( 1, &denyAccess, NULL, &pTempDacl ); // check dwErr... dwErr = SetSecurityInfo( hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL ); // check dwErr... LocalFree( pTempDacl ); CloseHandle( hProcess ); return dwErr == ERROR_SUCCESS; } 

Cuando ejecuto mi copia de eso, se ha denegado establecer el permiso Terminar (Process Explorer muestra esto).

Presumiblemente llaman a SetKernelObjectSecurity para cambiar / eliminar las ACL cuando se carga su proceso.

El código proporcionado en la pregunta es engañoso. Construye una DACL sin entradas permitidas y una entrada denegada; eso podría tener sentido si estuviera aplicando la DACL a un archivo con herencia habilitada, pero en este caso la entrada de denegación es redundante. En el modelo de control de acceso de Windows, si existe una DACL pero no contiene una ACE coincidente, el acceso se niega implícitamente .

Aquí está mi versión, que aplica una DACL vacía, denegando todo acceso. (Tenga en cuenta que devuelve un código de error en lugar de un booleano).

 DWORD ProtectProcess(void) { HANDLE hProcess = GetCurrentProcess(); PACL pEmptyDacl; DWORD dwErr; // using malloc guarantees proper alignment pEmptyDacl = (PACL)malloc(sizeof(ACL)); if (!InitializeAcl(pEmptyDacl, sizeof(ACL), ACL_REVISION)) { dwErr = GetLastError(); } else { dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pEmptyDacl, NULL); } free(pEmptyDacl); return dwErr; } 

He intentado hacerlo con la ayuda de escribir servicios de Windows … y luego hacer algunos cambios

aquí está el enlace para escribir un servicio de Windows simple http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948

y podemos actualizar el archivo Servicabase.cpp con las siguientes dos declaraciones ..

fCanStop = FALSE; fCanShutdown = FALSE;