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

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

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.