begin process at 2012 02 13 20:38:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité

 > COMMENT DÉTECTER LES PROCESSUS CACHÉS (VIRUS, ROOTKITS...) + ÉNUMÉRATION AVANCÉE DES PROCESSUS

COMMENT DÉTECTER LES PROCESSUS CACHÉS (VIRUS, ROOTKITS...) + ÉNUMÉRATION AVANCÉE DES PROCESSUS


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Sécurité Source .NET ( DotNet ) Classé sous :processus, virus, rootkit, caché, process Niveau :Expert Date de création :21/04/2009 Vu / téléchargé :15 299 / 1 490

Auteur : violent_ken

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
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-Det ect-Hidden-Processes-Part-1.html
http://blog.scani t.net/index.php?/archives/7-Detect-Hidden-Processe s-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-CH OIX-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

  • ' Dans le zip !!
  • ' infos utiles sur ZwQuery ici http://forum.sysinternals.com/forum_posts.asp?TID=3577
' 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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) UTILITAIRE DE SANITIZATION DES DISQUES DURS/FICHIERS (SUPPRE...
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLE SHUTDOWN SCHEDULER : ARRÊTS PLANIFIÉS (LOCAL OU REMOT...
Source avec Zip Source .NET (Dotnet) COMMENT DÉMARRER UN PROCESSUS SUR PC DISTANT DE MANIÈRE CACH...
Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER (REMOTE) PROCESS MONITOR
Source avec Zip Source avec une capture Source .NET (Dotnet) COMMENT CONTRÔLER TOTALEMENT LES PROCESSUS D'UN PC DISTANT (...

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) CHIFFREMENT XOR PLUS ROBUSTE par dheroux
Source avec Zip CRYPTAGE MARANT par alpha5
Source avec Zip ACCÈS PAR MOT DE PASSE À FEUILLE EXCEL par mimiZanzan
Source avec Zip CRYPTER-DÉCRYPTER UN TEXTE - TEXTE CRYPTÉ UNIQUEMENT EN MAJ... par Saintache
Source avec Zip Source avec une capture FOLDER PROTECTION par hackoo

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) COMMENT DÉMARRER UN PROCESSUS SUR PC DISTANT DE MANIÈRE CACH... par violent_ken
Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER (REMOTE) PROCESS MONITOR par violent_ken
Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER PROCESS MONITOR par violent_ken
Source avec Zip Source avec une capture WIN++ OPTIONS AVANCÉES SUR LES FENETRES ET PROCESSUS WINDOWS... par MadM@tt
Source avec Zip Source avec une capture CPU LIMITER - LIMITEZ L'UTILISATION DU PROCESSEUR DE CHAQUE ... par MadM@tt

Commentaires et avis

Commentaire de violent_ken le 21/04/2009 20:58:23

Le fichier *.sys de Brunews est safe, mais des fois détecté par les antivirus.

Pour info : http://www.virustotal.com/fr/analisis/32cbf1ce905ae81c6149c8341c182381

@+

Commentaire de BadoqueAlex le 22/04/2009 00:24:08 9/10

Très joli travail de recherche et d'application. 9/10

Commentaire de violent_ken le 22/04/2009 06:53:37

merci :-)

Par contre de mémoire, je crois que j'ai oublié un Marshal.FreeHGlobal à la fin de EnumerateHandles...

@+

Commentaire de EBArtSoft le 22/04/2009 08:49:56 administrateur CS

Bien, c'est pas très ".net friendly" mais bien quand même :p

Commentaire de griffondorr le 22/04/2009 11:01:51 10/10

belle sources ;) fallais y penser ;)

Commentaire de MadM@tt le 22/04/2009 16:13:20

Intéressant !

Commentaire de aitnamane le 22/04/2009 17:52:07

merci bien
un bon code.

Commentaire de violent_ken le 22/04/2009 18:28:25

Merci pour les commentaires :-)

J'avoue que cà fait pas trop VB.Net, mais bon, comme on dispose de la classe Marshal, autant l'utiliser ;-) Et pi le framework est complètement incapable de faire tout çà ^^


Sinon j'ai oublié de préciser 2 trucs :

- y a du code vraiment superflu là dedans (genre l'héritage avec generalInfos, ou même carrément processInfos, toutes les déclarations dans API.vb), j'ai pas viré tout çà parce que j'avais la flemme, j'ai tout extrait de mon autre code, YAPM :-p
Ce qui est intéressant est donc dans cProcess.vb.

- j'ai laissé en commentaires dans getVisibleProcesses du code pour pouvoir récupérer la liste des threads en même temps que la liste des processus, via ZwQuerySystemInformation.

D'ailleurs au passage, je précise que ZwQuerySystemInformation est une fonction absolument géniale, mais malheureusement non documentée ! A titre d'information, la récupération des processus dans getVisibleProcesses permet :
- de récupérer tous les processus sans ouvrir un seul Handle
- de récupérer toutes les infos sur la mémoire, les I/O, les temps CPU...etc sans ouvrir un seul handle
- de récupérer la liste des threads et toutes les infos dessus (temps CPU...) en même temps sans ouvrir un seul handle
Et tout çà en un temps vraiment record (nécessite bcp moins de CPU que taskmgr par exemple). Bref, c'est vraiment ce qu'il y a à privilégier comme méthode de listing des processus, pour peu qu'on ait besoin de quelques infos, genre la mémoire ou autre.


Sinon si vous avez des infos sur :
- pourquoi certains processus sont présents sous plusieurs PID différents ??
- pourquoi Windows (XP) cache des fois ses processus de taskmgr ??
n'hésitez pas je suis curieux !

Voilà, @+

Commentaire de violent_ken le 23/04/2009 16:33:18

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à
@+

Commentaire de MadM@tt le 23/04/2009 16:40:40

On est en plein "the dark side of windows"

Commentaire de e_NeX le 27/04/2009 14:27:42

faites un petit tour du coté du prefetch de windows. vous aurez surement la réponse :)

Commentaire de mao02 le 21/05/2009 01:53:05

bon travaille ;)

Commentaire de mostafameknes le 25/05/2009 19:30:58

merci c'est bon travail continuer...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Pourcentage d'un processus thread ou process CPU [ par DavidT ] Comme le gestionnaire de tache, il existe la possibilité de de visualiser sur un système NT la mémoire physique consommée par un process déterminé par Tester présence d'un process + tester fin d'un process [ par lionel4 ] Voila je cherche deux trucs. Un code pour tester si un processus est en cours, et un autre pour detecter la fin d'un processus.Merci !Lionel4 - Débuta URGENT : LANCER UN PROCESSUS WINDOWS QUI S'EST ARRETE [ par dark_muse ] Bonjour à tous !!Je suis encore débutante en vb mais y'a un début à tout hein !!Alors voilà. Je voudrai trouver quelque chose lancer une appli à distance avec winmgmts [ par centralvince ] Voilà, j'ai réussi à lancer un processus à distance comme cela :Set process = GetObject("winmgmts:{impersonationLevel=impersonate}!//ordianateur_dista Processus et Windows CE [ par tfrancais ] Est-ce qu'il est possible de contrôler le nombre de scession pour une applications sous Windows CE comme on peut le faire sous Windows avec ces q Problème sur API OpenProcess [ par violent_ken ] Violent Ken Bonjour, je cherche à récupérer des informations sur les processus lancés. J'utilise donc les API Openprocess, EnumPro Process et threads en .NET [ par mastercatz ] Je voulais savoir comment on peut detecter la création d'un processus. Par exemple, dans mon prog a un moment il est question d'enregistrer le PID d'u Terminer Processus fils (child Process) [ par davidauche ] Bonjour,Svp, j'aime killer un child process en VB6. A est le processus de départDe A je cree un nouveau processus B (donc je connais son hWnd via la p Kill un process bien definie [ par ImmortalPC ] Salut,Déjà sachez que je connais très peu le VB.Ma question est comment tuer un processus bien definie?Pour l'exemple le processus sera Avoir les processus ... [ par allthew3 ] Bonjour,Je trouve pas une source bien pour mon problème ... (si vous en avez une, dites-le moi :-)J'aimerais avoir processus par prossesus, les proces


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales