36 votes

Comment masquer un processus dans le Gestionnaire des tâches en C #?

J'ai une exigence pour masquer un processus dans le Gestionnaire des Tâches. C'est pour Intranet. Donc, tout est légitime. :)

N'hésitez pas à partager tout code que vous avez (de préférence en C#) ou d'autres techniques ou des problèmes dans cette voie.

Update1: la Plupart des utilisateurs ont des privilèges d'administrateur pour exécuter certaines applications existantes. Alors, un de la suggestion est de le cacher dans le gestionnaire des tâches. Si il existe d'autres méthodes pour empêcher les utilisateurs de tuer le processus, ce serait génial.

Update2: la Suppression de la référence à rootkit. En quelque sorte, fait ce post aspect négatif.

74voto

Jon Skeet Points 692016

N'essayez pas de l'empêcher d'être tué - vous n'allez pas le gérer. Au lieu de cela, faites-le appeler régulièrement un service Web. Lorsque le service Web remarque qu'un client "se tait", il peut envoyer une requête ping à la machine pour voir s'il s'agit simplement d'un problème de redémarrage et envoyer un e-mail à un responsable (ou à quiconque) pour discipliner quiconque a tué le processus.

50voto

Chris Smith Points 2858

Il n'existe aucun moyen pour accomplir cette tâche. La liste des processus peut être lu à n'importe quel niveau de privilège. Si vous espériez pour masquer un processus de même les Administrateurs, alors c'est doublement pas pris en charge.

Pour obtenir que cela fonctionne, vous devez écrire un mode noyau de rootkit pour intercepter les appels à NtQuerySystemInformation de sorte que le SystemProcessInformation classe info ne parvient pas à la liste de vos processus caché.

Interception des appels système est très difficile de le faire en toute sécurité, et la version 64 bits de Windows noyaux vont sortir de leur façon d'empêcher que cela soit possible: essayer de modifier le syscall table de résultats en un instant l'écran bleu. Il va être très difficile sur ces plates-formes

Ici est un exemple d'un rootkit qui essaie de faire quelque chose de similaire (et a plusieurs problèmes graves).

19voto

Chris Smith Points 2858

Si vous souhaitez empêcher les utilisateurs de tuer le processus dans le gestionnaire des tâches, vous pouvez simplement utiliser un descripteur de sécurité sur le processus de refuser de résilier votre accès à tout le monde. Les administrateurs, techniquement, peuvent encore tuer le processus en prenant en charge le processus et la réinitialisation de la liste DACL, mais il n'y a pas d'interface pour effectuer une de ces choses dans le Gestionnaire des Tâches. L'Explorateur de processus peuvent avoir une interface bien.

Lors de votre démarrage du processus, l'utilisation SetKernelObjectSecurity avec DACL_SECURITY_INFORMATION en utilisant le processus actuel de la poignée. Définir une liste DACL avec zéro Acl. Cela permettra de refuser l'accès à tout le monde, y compris ceux qui tentent de mettre fin à votre processus avec le gestionnaire de tâches.

Voici un exemple qui modifie également le processus du propriétaire:

SECURITY_DESCRIPTOR sd;
ACL dacl;
SID_IDENTIFIER_AUTHORITY ntauth = SECURITY_NT_AUTHORITY;
PSID owner;

assert(InitializeAcl(&dacl, sizeof dacl, ACL_REVISION));

assert(AllocateAndInitializeSid(&ntauth, 1, SECURITY_LOCAL_SYSTEM_RID, 0,0,0,0,0,0,0, &owner));

assert(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION));

assert(SetSecurityDescriptorDacl(&sd, TRUE, &dacl, FALSE));

assert(SetSecurityDescriptorOwner(&sd, owner, FALSE));

assert(SetKernelObjectSecurity(GetCurrentProcess(), DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &sd));

assert(FreeSid(owner) == NULL);

Malheureusement, il ne semble pas être efficace. Je peux encore fermer les processus (bien que n'étant pas un utilisateur limité). Peut-être le Gestionnaire des Tâches est de la prise de possession ou en appelant certaines autres privilège de tuer le processus? Je crois me souvenir de ce travail dans les versions précédentes de Windows (j'ai été le tester 2003), mais je peux me tromper.

10voto

Marcin Points 25366

J'espère que vous ne pourrez pas.

Mise à jour: compte tenu du scénario, je pense que vous feriez probablement mieux de l'exécuter sous un autre compte administrateur. Cela peut aider à alerter les gens sur le fait qu'ils ne devraient pas tuer le processus.

7voto

Chris Pietschmann Points 13397

Alternativement, vous pouvez écrire un petit utilitaire "vérificateur" qui vérifie si l'application est en cours d'exécution, si ce n'est pas le cas, elle démarre automatiquement. Ajoutez ensuite du code à l'application pour vérifier l'utilitaire "vérificateur" qui fait de même. De cette façon, si l'un est terminé, l'autre le redémarre. J'ai l'impression que les virus font cela, et cela semble fonctionner assez efficacement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X