Comment détecter les processus cachés (virus, rootkits...) + énumération avancée des processus

Soyez le premier à donner votre avis sur cette source.

Vue 23 780 fois - Téléchargée 2 230 fois

Description

Bonjour,

voilà une source montrant comment avoir la liste des processus cachés qui tournent sur le système (XP ou VISTA).

Je suis tombé sur un blog très intéressant, qui détaille plusieurs méthodes d'énumération de processus. Outre les principales méthodes très connues (ordre de la pire à la meilleure : ToolHelp32, EnumProcesses, ZwQuerySystemInformation), il y a des infos sur les méthodes les moins connues, qui permettent de récupérer d'autres PID (process ID) invisibles par les méthodes traditionnelles. J'ai donc codé en .Net à partir de çà notamment.

On peut ainsi visualiser, grâce à cette source, les virus/rootkits qui se cachent :-)

D'ailleurs au passage, Windows cache aussi certains processus, pour une raison que j'ignore (regedt32.exe par exemple sous XP, des fois caché au démarrage) ???? Si vous avez des infos là dessus, je suis preneur...

Je vous invite donc à lire ce blog (en anglais) :
http://blog.scanit.net/index.php?/archives/6-Detect-Hidden-Processes-Part-1.html
http://blog.scanit.net/index.php?/archives/7-Detect-Hidden-Processes-Part-2.html

DETAIL DU FONCTIONNEMENT

Comme nous sommes en langage très haut niveau exclusivement (VB.Net), c'est du USER MODE. C'est d'un côté un avantage (pas d'install de driver et simple à coder), mais d'un autre côté c'est limité évidemment : je tiens à préciser que les rootkits les plus évolués passent à travers le listing par ma source des process cachés.
Egalement, il faut les droits d'admin (pour obtenir un handle sur csrss.exe).

J'ai implémenté deux méthodes différentes :

1) brute force : très "intuitif" ^^, il suffit de faire un OpenProcess pour TOUS LES PIDS (process id) possibles ;-)
On part de 8 jusqu'à 65535 (limite théorique, mais on peut s'arrêter avant) avec un pas de 4. Le pas est fixé à 4 car tous les processus ont un PID divisible par 4, c'est une règle non généralisable normalement (pas dans les spécifs), mais en réalité c'est toujours le cas pour un NT.
Remarque : un OpenProcess sur le PID 727 alors que le process 724 existe fonctionnera. Dans l'implémentation du OpenProcess, les deux derniers bits du paramètre ne sont en effet pas lus (donc PID EXISTANT +1, +2 ou +3 marche).
Bref, si l'OpenProcess fonctionne, le PID existe et le processus correspondant également.

On compare ensuite tous les processus trouvés avec une liste obtenue par une méthode classique (ZwQuerySystemInformation dans mon cas, code extrait de ma source YAPM, la plus puissante et la plus rapide des méthodes user mode).

A noter que certains processus apparaissent avec plusieurs PID différents. Je n'ai pas de réponse pour çà, si vous savez pourquoi dites le moi svp.

2) méthode des "handles". Sans rentrer dans les détails du fonctionnement d'un CreateProcess dans NT, un handle d'un processus créé est obligatoirement gardé ouvert dans l'instance du processus csrss.exe. Par conséquent, on liste tous les handles, ensuite on liste les instances de csrss.exe, et pour chaque handle dont le PID est celui d'un csrss.exe, on fait un DuplicateHandle et on récupère le PID des processus créés par des GetProcessId des handles dupliqués.

Comme le handle de csrss.exe est nécessaire, il est faut que ce handle soit connu. Il est forcément connu via OpenProcess, mais il faut connaitre le PID... donc il faut qu'il soit visible par une méthode d'énumération classique. Bref, si csrss.exe est caché, la méthode des "handles" échouera.
De même, il est possible de fermer le handle du processus caché ouvert par csrss.exe (pour quels résultats par contre ??) et on peut également cacher des handles (kernel mode). Bref, la méthode est loin d'être infaillible, mais comme le dit très justement l'article : pour les rootkits de base, normalement çà suffit !

COMMENT CACHER UN PROCESSUS ?

Pour tester la source, on peut cacher un processus de tout gestionnaire de tâche (taskmgr, process explorer...) avec une source de Brunews. C'est du kernel en C, la source est là : http://www.cppfrance.com/codes/CACHER-PROCESSUS-CHOIX-DRIVER-WIN32_36941.aspx

Je fourni la version compilée dans le fichier _hide_proc.rename. C'est une archive zip (à renommer). Avant d'extraire le driver et l'exe de cette archive, désactivez votre antivirus sinon l'analyse heuristique de ce dernier risque fort de vous trouver, à tort, un virus. Rien d'étonnant, puisque la méthode doit être utilisée par certains rootkits. Bref, c'est SAFE ET GARANTI SANS VIRUS, les sources sont dispo (cf lien en dessus).

A noter que pour tout détecter, le USER MODE ne suffit plus, et il existe des méthodes très intéressantes pour lister les processus en mode kernel : je vous invite à lire le blog (partie 2).
Le VB.Net ne suffit donc plus, mais cette source montre, je pense, comment manipuler/lister des processus de manière très correcte pour du VB.Net/UserMode.

Voilà !
@+

Source / Exemple :


' Dans le zip !!

' infos utiles sur ZwQuery ici http://forum.sysinternals.com/forum_posts.asp?TID=3577

Conclusion :


Pour le masquage des processus, bien penser à supprimer le driver avant de quitter !

Droits admin requis.

Testé sur XP virtualisé et VISTA PRO.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
8
Date d'inscription
jeudi 6 mars 2008
Statut
Membre
Dernière intervention
25 mai 2009

merci c'est bon travail continuer...
Messages postés
2
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
22 mai 2009

bon travaille ;)
Messages postés
105
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
30 novembre 2009

faites un petit tour du coté du prefetch de windows. vous aurez surement la réponse :)
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

On est en plein "the dark side of windows"
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
J'ai trouvé la réponse aux 2 questions :

En fait, lorsqu'un processus a été tué, il reste bizarrement ouvrable via OpenProcess. Du coup pour les questions :

1) -> quand le processus a été lancé puis tué plusieurs fois, tous les précédents lancements sont considérés comme des processus cachés par la méthode "brute force". Le process n'existe en fait bien qu'une seule fois, sont détectées cachées uniquement les instances qui ont été tuées.
2) -> XP cache rien, c'est juste des processus qui ont été tués.


La question est donc : pourquoi OpenProcess marche avec les processus tués ? Et pourquoi certaines infos (le path par exemple) restent-elles disponibles pour les processus après leur mort ???

Quoi qu'il en soit, il doit être possible de différencier les processus tués des processus cachés via GetExitCodeProcess.

Pour compléter sur le sujet : le pid du processus tué restera pointé sur un processus tué et sera ouvrable (pour renvoyer les infos sur le processus tué) jusqu'à ce que le pid soit réutilisé par un nouveau processus. Il est également possible d'empêcher un processus de prendre l'ancien PID d'un autre en gardant un handle ouvert sur ce PID.

Voilà
@+
Afficher les 13 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.