Bash establece la variable de entorno _
a la ruta del comando que se está ejecutando. Lo mismo ocurre con zsh y pdksh. Pero otros shells, como fish and dash (que es el shell de secuencias de comandos predeterminado en muchas distribuciones de Linux) no lo hacen. ATT ksh lo establece en un valor que incluye la ruta al comando.
La idea es que un programa pueda comprobar el valor de la variable de entorno _
para ver qué lo invocó, supongo. Excepto que esto es extremadamente poco confiable incluso si el usuario no está haciendo nada para cambiarlo. Si el programa se inicia desde una GUI o mediante un script, _
podría estar vacío o podría tener algún valor completamente no relacionado, y eso es perfectamente legítimo y muy común. Y, por supuesto, si el usuario quiere cambiarlo, es absolutamente trivial:simplemente ejecute env -u _ myprogram
o env myprogram
.
En cuanto a las medidas "anti-depuración", esta es bastante ridícula. No solo es falsificable sin ningún esfuerzo, sino que en realidad no funcionaría con un uso normal. Si algún material de lectura lo promociona como una medida contra la depuración, no recomendaría este material como muy poco confiable.
En este contexto, el _
La variable de entorno normalmente contendrá la ruta al depurador que inició el programa en lugar del programa en sí. El programa que intenta detectar el depurador puede leer esa variable y comportarse de manera diferente si ve el depurador (quizás buscando nombres de depuradores conocidos como gdb
o comparándolo con argv[0]
).
Aquí hay un ejemplo que muestra esta variable en acción y cómo se diferencia de argv[0]
:
Código 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;
}
Salida de 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)
NOTA:Esto no es exclusivo de Linux, puede hacerlo en macOS y probablemente también en otros sistemas POSIX.
NOTA TAMBIÉN:Es un truco realmente barato que es realmente fácil de eludir y tiene una alta probabilidad de no funcionar según lo previsto (tanto falsos positivos como falsos negativos).