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

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

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.