Bash setzt die Umgebungsvariable _
auf den Pfad zu dem Befehl, der gerade ausgeführt wird. Also zsh und pdksh. Aber andere Shells wie fish und dash (die Standard-Scripting-Shell auf vielen Linux-Distributionen) tun dies nicht. ATT ksh setzt es auf einen Wert, der den Pfad zum Befehl enthält.
Die Idee ist, dass ein Programm den Wert der Umgebungsvariable _
prüfen kann um zu sehen, was es aufgerufen hat, denke ich. Abgesehen davon, dass dies äußerst unzuverlässig ist, selbst wenn der Benutzer nichts unternimmt, um es zu ändern. Wenn das Programm von einer GUI oder über ein Skript gestartet wird, _
kann leer sein oder einen völlig unabhängigen Wert haben, und das ist vollkommen legitim und sehr verbreitet. Und wenn der Benutzer es ändern möchte, ist es natürlich absolut trivial – führen Sie einfach env -u _ myprogram
aus oder env myprogram
.
Was „Anti-Debugging“-Maßnahmen angeht, ist diese ziemlich lächerlich. Es ist nicht nur ohne großen Aufwand fälschbar, es würde im normalen Gebrauch auch nicht funktionieren. Wenn es in einigen Lesematerialien als Anti-Debugging-Maßnahme angepriesen wird, würde ich von diesem Material als sehr unzuverlässig abraten.
In diesem Zusammenhang die _
Die Umgebungsvariable enthält normalerweise den Pfad zum Debugger, der das Programm gestartet hat, und nicht das Programm selbst. Das Programm, das versucht, den Debugger zu erkennen, kann dann diese Variable lesen und sich anders verhalten, wenn es den Debugger sieht (vielleicht indem es nach bekannten Debugger-Namen wie gdb
sucht oder durch Vergleich mit argv[0]
).
Hier ist ein Beispiel, das diese Variable in Aktion zeigt und wie sie sich von argv[0]
unterscheidet :
C-Code:
#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;
}
Shell-Ausgabe:
$ 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)
HINWEIS:Dies gilt nicht nur für Linux, sondern auch für macOS und wahrscheinlich auch für andere POSIX-Systeme.
BEACHTEN SIE AUCH:Das ist ein wirklich billiger Trick, der wirklich einfach zu umgehen ist und eine hohe Wahrscheinlichkeit hat, dass er nicht wie beabsichtigt funktioniert (sowohl falsch positive als auch falsch negative).