2011-05-31 1 views
15

J'ai remarqué que GoogleToolbarNotifier.exe ne peut pas être supprimé à partir de l'Explorateur de processus. Il renvoie "Accès refusé". Il s'exécute en tant qu'utilisateur, il exécute la priorité "Normal" et il s'exécute à partir de Program Files.Empêche le processus utilisateur d'être tué avec "End Process" à partir de l'Explorateur de processus

Comment ont-ils fait?

Je pense qu'il pourrait y avoir un moyen de modifier l'ACL, ou marquer le processus comme «critique», mais je n'arrive pas à trouver quelque chose.

Mise à jour:

J'ai trouvé la réponse avec un bon peu de creuser. K. @ Alex a eu raison de cette autorisation de PROCESS_TERMINATE a été retiré du processus, mais je voulais fournir la réponse dans le code:

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; 
} 
+0

Est-ce qu'il s'exécute avec des permissions d'administrateur et PE n'est pas? – Sushisource

+0

PE s'exécute avec des autorisations admin (élevées). Le processus est un utilisateur normal non administrateur. – Blazes

+0

cela fonctionne très bien, merci. Vous devez le publier comme une réponse et l'accepter –

Répondre

9

Lors de l'exécution de ma copie de ce a Deny ensemble sur la Terminate autorisation (Process Explorer le montre).

On suppose qu'ils appellent SetKernelObjectSecurity pour modifier/supprimer les listes de contrôle d'accès lors du chargement de leur processus.

+7

Notez que cela n'a aucun effet lors de l'exécution de programmes tels que Task Manager et Process Explorer en tant qu'admin, car avec SeDebugPrivilege, la vérification d'accès est ignorée pour les processus et les threads. – wj32

+0

Vous avez crédité parce que vous aviez raison sur l'autorisation PROCESS_TERMINATE. J'ai finalement trouvé le code pour le faire ... – Blazes

10

Le code donné dans la question est trompeur. Il construit un DACL avec aucune entrée d'autorisation et une entrée de refus; cela pourrait avoir du sens si vous appliquiez la liste DACL à un fichier avec l'héritage activé, mais dans ce cas, l'entrée deny est redondante. Dans le modèle de contrôle d'accès Windows, si une liste DACL existe mais ne contient pas ACE correspondant, access is implicitly denied.

Voici ma version, qui applique un DACL vide, refusant tout accès. (Notez qu'il renvoie un code d'erreur plutôt que d'un booléen.)

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; 
} 
+0

cette solution n'a pas fonctionné pour moi sur XP. Je pourrais toujours terminer le processus de Process Explorer. – kobik

+0

@kobik: étiez-vous connecté en tant qu'administrateur? XP n'a pas d'UAC, donc si vous avez ouvert une session avec des droits d'administrateur, Process Explorer s'exécute avec des droits d'administration. Comme wj32 l'a déjà noté, si Process Explorer est exécuté avec des droits d'administration, les autorisations de processus sont ignorées. C'est par conception. –

+0

@SneakyTactician, le Gestionnaire des tâches de Windows 10 se rehausse automatiquement, donc si votre compte a des privilèges administratifs - ce qu'il fera habituellement, sauf peut-être dans un environnement d'entreprise - alors le Gestionnaire des tâches sera toujours capable de tuer un processus sans tenir compte des permissions. (Sous Windows 7, vous deviez demander au Gestionnaire des tâches de l'élever via le bouton "Afficher les processus de tous les utilisateurs".) –

-3

J'ai essayé de le faire avec l'aide de l'écriture des services Windows ..et puis faire quelques changements

est ici le lien vers écrire simple service windows http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948

et nous pouvons mettre à jour le fichier Servicabase.cpp avec les deux énoncés suivants ..

fCanStop = FAUX; fCanShutdown = FALSE;

+0

une petite console par ex. à savoir nuke-m peut tuer votre service sur le vol. même si vous définissez les deux valeurs false. –

+0

Ceci n'affecte pas l'Explorateur de Processus, cela n'affectera que l'outil administratif du Service (et des outils équivalents tels que 'sc'). Donc, ce n'est pas pertinent à cette question. –

Questions connexes