Énumération des processus et déchargement forcé de dll

Soyez le premier à donner votre avis sur cette source.

Vue 11 905 fois - Téléchargée 858 fois

Description

En travaillant sur une dll de hook système, je me suis souvent arraché les cheveux parce qu'elle se déchargeait mal. J'ai donc repensé à une source que j'avais vue ici qui permettait d'injecter du code dans les autres applications, et me suis dit pourquoi ne pas l'utiliser pour décharger ma dll à coups de FreeLibrary ?

Voici le résultat, un petit utilitaire qui scanne tous les processus (en obtenant les PID directement à partir de la perflib, cette méthode n'a jamais été présentée sur cppfrance à ma connaissance - en tout cas mes recherches ne m'ont ramené sur aucune source) et crée un thread distant afin de décharger la dll, si elle est présente. Le thread renvoie un entier qui indique le résultat de l'opération (succès, erreur ou dll non présente dans ce processus).

Le code s'explique de lui même et n'est donc PAS commenté, lisez les liens fournis en annexe pour le comprendre...

Source / Exemple :


Sortie du programme chez moi :
Tentative de désinfection de `System.exe' (PID 4) ... impossible d'ouvrir le processus !
Tentative de désinfection de `smss.exe' (PID 368) ... impossible d'ouvrir le processus !
Tentative de désinfection de `csrss.exe' (PID 424) ... impossible d'ouvrir le processus !
Tentative de désinfection de `winlogon.exe' (PID 448) ... impossible d'ouvrir le processus !
Tentative de désinfection de `services.exe' (PID 492) ... impossible d'ouvrir le processus !
Tentative de désinfection de `lsass.exe' (PID 504) ... impossible d'ouvrir le processus !
Tentative de désinfection de `svchost.exe' (PID 648) ... impossible d'ouvrir le processus !
Tentative de désinfection de `svchost.exe' (PID 716) ... impossible d'ouvrir le processus !
Tentative de désinfection de `svchost.exe' (PID 756) ... impossible d'ouvrir le processus !
Tentative de désinfection de `svchost.exe' (PID 816) ... impossible d'ouvrir le processus !
Tentative de désinfection de `svchost.exe' (PID 836) ... impossible d'ouvrir le processus !
Tentative de désinfection de `spoolsv.exe' (PID 1008) ... impossible d'ouvrir le processus !
Tentative de désinfection de `nvsvc32.exe' (PID 1172) ... impossible d'ouvrir le processus !
Tentative de désinfection de `vmware-authd.exe' (PID 1284) ... impossible d'ouvrir le processus !
Tentative de désinfection de `vmnat.exe' (PID 1300) ... impossible d'ouvrir le processus !
Tentative de désinfection de `vmnetdhcp.exe' (PID 1328) ... impossible d'ouvrir le processus !
Tentative de désinfection de `alg.exe' (PID 1500) ... impossible d'ouvrir le processus !
Tentative de désinfection de `sleep.exe' (PID 1792) ... ce processus n'est pas infecté
Tentative de désinfection de `svchost.exe' (PID 1896) ... impossible d'ouvrir le processus !
Tentative de désinfection de `winamp.exe' (PID 3456) ... ce processus n'est pas infecté
Tentative de désinfection de `stunnel-4.08.exe' (PID 2860) ... ce processus n'est pas infecté
Tentative de désinfection de `mirc.exe' (PID 2656) ... désinfection réussie
Tentative de désinfection de `thunderbird.exe' (PID 572) ... ce processus n'est pas infecté
Tentative de désinfection de `firefox.exe' (PID 700) ... désinfection réussie
Tentative de désinfection de `taskmgr.exe' (PID 3880) ... désinfection réussie
Tentative de désinfection de `explorer.exe' (PID 140) ... désinfection réussie
Tentative de désinfection de `xchat.exe' (PID 196) ... désinfection réussie
Tentative de désinfection de `cmd.exe' (PID 2604) ... ce processus n'est pas infecté
Tentative de désinfection de `rundll32.exe' (PID 2776) ... désinfection réussie
Tentative de désinfection de `clean.exe' (PID 1424) ... ce processus n'est pas infecté

Conclusion :


Les processus impossibles à ouvrir correspondent aux services, il est possible de les désinfecter quand même en se donnant le SeDebugPrivilege (voir plus bas).

Seule contrainte actuellement : il faut recompiler le programme pour changer le nom de la dll à supprimer (MODULE_NAME dans le fichier main.c).

J'attend vos commentaires, critiques, remarques, questions... etc :)

-----
Doc sur la perflib : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/performance_data_format.asp
Source qui explique les remote threads, de BlackGoddess : http://www.cppfrance.com/code.aspx?id=10743
Pour désinfecter même les services, SetDebugPrivileges : http://www.cppfrance.com/code.aspx?id=26858

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

mirlaine
Messages postés
32
Date d'inscription
samedi 9 août 2003
Statut
Membre
Dernière intervention
24 août 2005
-
salut c'est original comme méthode pour list les process

sinon je croi ya moyen que ca marche avec tou les process...
je me rappel plus comment a+
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Si tu parles des processus impossibles à ouvrir, je donne la solution dans mon dernier lien (en plus tu t'en sers dans une de tes sources :p) : SeDebugPrivilege :)
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Je précise tout de même pour ceux qui auraient envie d'essayer qu'il serait extrêmement dangereux pour la stabilité du système d'activer ce privilège et d'exécuter mon programme tel quel : la plupart des services système de microsoft sont des applications natives qui ne dépendent que de ntdll, donc n'ont pas de kernel32 mappée en mémoire (ce qui implique pas de GetModuleHandle ni de FreeLibrary dans le thread distant, sinon BOUM)...

Soit il faudrait les forcer à charger kernel32 (en passant par l'api native), soit il faudrait utiliser directement l'api native dans le thread distant... Si tu es motivé, ntdll est une des rares dll avec kernel32 et user32 à être toujours chargée à son adresse de prédilection (ce qui signifie que ses fonctions ont les mêmes adresses dans tous les processus courants).

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.