Bash définit la variable d'environnement _
au chemin d'accès à la commande en cours d'exécution. Faites de même avec zsh et pdksh. Mais d'autres shells, tels que fish et dash (qui est le shell de script par défaut sur de nombreuses distributions Linux) ne le font pas. ATT ksh le définit sur une valeur qui inclut le chemin d'accès à la commande.
L'idée est qu'un programme peut vérifier la valeur de la variable d'environnement _
pour voir ce qui l'a invoqué, je suppose. Sauf que c'est extrêmement peu fiable même si l'utilisateur ne fait rien pour le changer. Si le programme est lancé depuis une interface graphique ou via un script, _
pourrait être vide ou avoir une valeur totalement indépendante, et c'est parfaitement légitime et très courant. Et bien sûr, si l'utilisateur veut le changer, c'est absolument trivial - il suffit d'exécuter env -u _ myprogram
ou env myprogram
.
En ce qui concerne les mesures "anti-débogage", celle-ci est assez ridicule. Non seulement il est usurpable sans effort, mais il ne fonctionnerait pas dans des conditions normales d'utilisation. Si certains documents de lecture le vantent comme une mesure anti-débogage, je déconseillerais ce matériel comme très peu fiable.
Dans ce contexte, le _
La variable d'environnement contiendra généralement le chemin d'accès au débogueur qui a démarré le programme plutôt que le programme lui-même. Le programme essayant de détecter le débogueur peut alors lire cette variable et se comporter différemment s'il voit le débogueur (peut-être en recherchant des noms de débogueur connus comme gdb
ou en le comparant à argv[0]
).
Voici un exemple qui montre cette variable en action et en quoi elle diffère de argv[0]
:
Code C :
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
char *path = getenv("_");
printf("%s\n", argv[0]);
printf("%s\n", path);
return 0;
}
Sortie du shell :
$ gcc -o main main.c
$ ./main
./main
./main
$ gdb main
...
(gdb) r
Starting program: /home/user/tmp/main
/home/user/tmp/main
/usr/bin/gdb
[Inferior 1 (process 21694) exited normally]
(gdb)
REMARQUE :ce n'est pas propre à Linux, vous pouvez le faire sur macOS et probablement sur d'autres systèmes POSIX également.
REMARQUE ÉGALEMENT :Il s'agit d'une astuce vraiment bon marché, très facile à contourner et qui a de fortes chances de ne pas fonctionner comme prévu (faux positifs et faux négatifs).