Kill any process

Soyez le premier à donner votre avis sur cette source.

Vue 27 337 fois - Téléchargée 1 577 fois

Description

J'ai écrit ce code en réponse à celui posté ici : http://www.cppfrance.com/code.aspx?ID=18232, qui permettait de rendre un processus insensible aux TerminateProcess (le fichier lazarus.exe dans mon zip reprend cette protection, pour ceux qui ont la flemme de compiler).

Non seulement ce code peut terminer les processus protégés ainsi, mais il peut également tuer n'importe quel processus, services compris (essayez avec crss.exe, pour voir :P)

J'insiste sur le fait que vous DEVEZ sauvegarder votre travail avant de tester un kill, une erreur dans le PID et vous pourriez bien avoir un écran bleu...

Source / Exemple :


#include <windows.h>

BOOL SetDebugPrivileges(VOID) {
  /* cette fonction permet au processus courant d'obtenir le privilège DEBUG,

  • autrement dit la capacité de manipuler n'importe quel processus du système...
*
  • pour retirer ce privilège, il suffit de mettre 0 au lieu de SE_PRIVILEGE_ENABLED
  • ne faites pas n'importe quoi avec, c'est vraiment très puissant (ne tuez pas crss.exe, par exemple)
*
  • fuite connue mais minime ici : il faudrait fermer les handles avant de quitter en cas d'erreur
  • /
DWORD dwPID; HANDLE hProcess; HANDLE hToken; LUID Luid; TOKEN_PRIVILEGES tpDebug; dwPID = GetCurrentProcessId(); if ((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) == NULL) return FALSE; if (OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken) == 0) return FALSE; if ((LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid)) == 0) return FALSE; tpDebug.PrivilegeCount = 1; tpDebug.Privileges[0].Luid = Luid; tpDebug.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if ((AdjustTokenPrivileges(hToken, FALSE, &tpDebug, sizeof(tpDebug), NULL, NULL)) == 0) return FALSE; if (GetLastError() != ERROR_SUCCESS) return FALSE; CloseHandle(hToken); CloseHandle(hProcess); return TRUE; } #include <stdio.h> int main(int argc, char** argv) { /* cette fonction kille tous les processus dont le PID lui a été passé en argument *
  • attention, elle ne demande aucune confirmation et peut parfaitement planter votre système
  • si vous demandez à terminer un processus vital (essayez avec crss.exe, par exemple)
  • /
int i = 0; if (argc < 2) { puts("Usage: kill <PID 1> [<PID 2> ... <PID n>]"); return 0; } if (SetDebugPrivileges() == 0) puts("Unable to grant debug privileges !"); while (++i < argc) { DWORD dwPID; HANDLE hProcess; dwPID = atoi(argv[i]); if ((hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwPID)) != NULL) { if (TerminateProcess(hProcess, 0) == 0) printf("Unable to kill process %lu !\n", dwPID); CloseHandle(hProcess); } else printf("Unable to access process %lu !\n", dwPID); } return 0; }

Conclusion :


Testé sous XP SP2 avec GCC 3.4.2 et Visual C++ 2003, fonctionne comme un charme.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
106
Date d'inscription
mardi 18 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2007

ok

N3buL4
Messages postés
1
Date d'inscription
vendredi 11 mars 2005
Statut
Membre
Dernière intervention
31 mai 2008

salut,
peut-être que je m'interroge pour rien, mais ta fonction setdebugprivilege est de type bool, et les tests effectués dans la fonction main font une comparaison avec du numérique.
ça ne pose pas de problème ?
Messages postés
2
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
26 novembre 2007

Salut Nebula. Ca marche très bien en effet mais uniquement sur une machine locale. Sais tu comment il est possible de tuer un process d'une machine connectée en réseau local ? J'arrive très bien à récupérer l'ID du process mais impossible de l'ouvrir. Le OpenProcess retourne systématiquement un NULL ?
Messages postés
2
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
2 mai 2007

yaurais pas moyen de trouver la meme apli mais avec le nom de l'executable, ou alors une apli qui en fonction du nom de l'executable donne le pid et en récupéran le résultat apliker cette methode ...
Messages postés
25
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
2 janvier 2006

Une méthode, simple, est d'aller dans le gestionnaire des taches, d'aller dans l'onglet Processus et de lire la colonne PID. Si elle n'est pas affiché, suffit de l'ajouter (Affichage / Sélerctionner les colonnes... / PID (Identificateur de processus...))

Sinon, tu peux aussi t'amuser à le programmer. ;o)
Afficher les 23 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.