web-dev-qa-db-fra.com

Que fait ENV («_») pour l'anti-débogage?

Je lis certains PPT et il est dit que ENV("_") peut être utilisé pour l'anti-débogage sous Linux

enter image description here

Quelqu'un sait-il ce que cela signifie?

35
daisy

Dans ce contexte, le _ La variable d'environnement contient 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 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 unique à Linux, vous pouvez le faire sur macOS et probablement sur d'autres systèmes POSIX également.

NOTEZ AUSSI: Le est une astuce vraiment bon marché qui est vraiment facile à contourner et a de fortes chances de ne pas fonctionner comme prévu (à la fois les faux positifs et les faux négatifs).

35
Alexander O'Mara

Bash définit la variable d'environnement _ vers le chemin d'accès à la commande en cours d'exécution. Il en va de même pour zsh et pdksh. Mais d'autres shells, comme fish et dash (qui est le shell de script par défaut sur de nombreuses distributions Linux) ne le font pas. ATT ksh lui attribue 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 cela est extrêmement peu fiable même si l'utilisateur ne fait rien pour le changer. Si le programme est lancé à partir d'une interface graphique ou via un script, _ pourrait être vide ou avoir une valeur complètement 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 peut être usurpé sans effort, mais il ne fonctionnerait pas réellement en utilisation normale. Si certains documents de lecture le vantent comme une mesure anti-débogage, je recommanderais contre ce matériel comme très peu fiable.