Récupérer les variables d'environnement de n'importe quel processus

Soyez le premier à donner votre avis sur cette source.

Vue 8 693 fois - Téléchargée 566 fois

Description

Bonjour,

voilà (encore) une source orientée système qui permet de récupérer (lecture seule uniquement) les variables d'environnement d'un processus quelconque.

Pour récupérer les variables du processus courant c'est on ne peut plus trivial avec Environment.GetEnvironmentVariables() :-)

Mais pour les autres processus, c'est une autre histoire...

Il existe deux méthodes pour les obtenir :

La première : "Méthode injection"
- Injecter une dll dans le processus dont on veut connaitre les variables d'environnement
- Ouvrir un nouveau thread dans le processus (CreateRemoteThread)
- Appeler GetEnvironmentStrings() qui récupère les variables du processus courant
- Libérer la dll

C'est très très moche et il faut le privilège Debug !

Du coup ici je vous propose une seconde méthode : il s'agit de lire les informations dans le PEB du processus.

Explication : plusieurs informations d'environnement sont stockées dans un espace mémoire de chacun des processus. Ces informations sont stockées dans le "PEB" (process environment block).
Il convient donc de lire dans la mémoire du processus désiré pour récupérer ces précieuses informations (via ReadProcessMemory).

Toute la difficulté est donc de récupérer l'emplacement mémoire à lire, puisqu'il n'est pas le même pour chacun des processus...

Voici donc comment procéder :
a) on récupère l'adresse du PEB, qui, contrairement à ce qu'on peut souvent lire sur Internet, N'EST PAS TOUJOURS la même (non, ce n'est pas toujours 0x7ffdf000 !!!). Du coup on appelle NtQueryInformationProcess pour obtenir cette info.

b) Le PEB possède plein d'informations inutiles pour nous, il faut donc trouver les bonnes. Il faudra donc dans un premier temps récupérer l'adresse mémoire d'un second block, appelé "ProcessParameters block". En effet, les variables d'environnement sont situées physiquement à une adresse variable, qui elle, est fixée à une adresse fixe dans le PEB.
On récupère donc l'adresse du "ProcessParameters block".

c) On récupère les variables d'environnement à proprement parler.
Elle sont situées à l'offset 0x48 (72) dans le "ProcessParameters block" pour tous les systèmes Windows NT. Toute la (nouvelle) difficulté est de récupérer la taille qu'elles occupent en mémoire.

Voilà comment elles sont architecturées en mémoire :
var1=val1@var2=val2@....@varn=valn@@ , avec le signe '@' représentant deux octets 0.
En effet, les informations sont codées au format Unicode, et donc chaque caractère prend 2 octets.

Les variables sont donc séparées par 00 00, et la fin de la liste est marqué par 00 00 00 00 (4 null bytes).

Donc on lit la mémoire jusqu'à trouver 00 00 00 00, on calcule la taille, ensuite on récupère dans un buffer la liste complète des variables, et on parse le tout pour que ce soit lisible par le commun des mortels (un tableau de shorts c'est moyen ^^).

Voilà pour le principe, la réalisation est dans le fichier zip.

Rappels divers :
- ANSI : caractères codés sur un octet (on voit ABCD dans un éditeur hexa)
- UNICODE : caractères codés sur 2 octets (on voit A.B.C.D. dans un éditeur hexa)
- Integer : 4 octets
- Short : 2 octets
- Byte : 1 octet
- Une adresse mémoire est codée sur 4 octets sur un système 32 bits
- Byte = Octet en anglais (rien à voir avec bit).

NB : pour le changement des variables d'environnement, par contre, il faudra forcément passer par de l'injection. Cf : http://www.codeproject.com/KB/threads/DynEnvVar.aspx

Voilà !!

@+

Conclusion :


Si j'ai fait quelques erreurs d'explication, n'hésitez pas à me corriger !

J'ai mis tous les commentaires en anglais, mais c'est compréhensible je pense (en plus je viens de détailler la méthode).

@+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Bon a priori Process Explorer renvoie les même résultats, donc çà devrait marcher de manière correcte normalement...

@+
cs_Patrice99
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018
-
Et toi tu vas l'utiliser dans quel but ?
violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Salut !

Bah personnellement, dans l'immédiat, c'est une fonction que je vais ajouter dans cette source : http://www.vbfrance.com/codes/YET-ANOTHER-PROCESS-MONITOR_48860.aspx

J'avais pas trouvé comment faire autrement, ben du coup j'ai proposé çà.


M'enfin, je viens de voir (juste au dessus, dans la liste des "Source en rapport avec celle ci") que ShareVB est passé bien avant moi :-)
http://www.vbfrance.com/codes/INFORMATIONS-SUR-PROCESSUS-LEUR-PEB-PARAMETRE-LIGNE-COMMANDE_38976.aspx

Mince !



Sinon bah du coup je vais travailler du côté de PEB_LDR_DATA (http://msdn.microsoft.com/en-us/library/aa813708.aspx) afin de proposer de pouvoir récupérer de manière originale (et rapide j'espère ! C'est le but recherché...) la liste des modules chargés par un processus, autrement que par toolhelp.

@+
cs_Patrice99
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018
-
Moi l'utilité que je voie c'est surtout la ligne de commande des services actifs, par exemple ceux en svchost.exe de façon a détecter des anomalies du type virus ou vers via une liste blanche par exemple. Mais les variables d'environnement, à priori je voie pas comment l'utiliser.
violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Oui la ligne de commande est en effet largement plus utile !

Sinon d'un point de vue "utilité" des variables d'environnement, ben effectivement c'est pas évident :-)

Si on veut trouver une utilité, parmi toutes les variables dispos, je dirais :
- on peut trouver utile de connaitre la valeur TEMP ou TMP des variables d'environnement, dans le cas on le programme les utilise pour stocker ses fichiers temporaires
- peut être aussi USERNAME et USERDOMAIN pour des applications réseau ?
- l'emplacement de stockage des fichiers utilisateur (APPDATA) ?

Bref, je sais pas trop ^^ A part les variables citées, le reste apparait pas franchement intéressant, d'autant que tous les processus ont à peu près les mêmes... :)

@+

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.