¿Qué hace ENV (“_”) para la depuración?

35

Estoy leyendo algunos PPT y dice que ENV("_") se puede usar para la depuración en Linux

¿Alguien sabe lo que significa?

    
pregunta daisy 20.06.2018 - 02:20
fuente

2 respuestas

36

En este contexto, la variable de entorno _ generalmente contendrá la ruta al depurador que inició el programa en lugar del programa mismo. El programa que intenta detectar al depurador puede leer esa variable y comportarse de manera diferente si ve al depurador (quizás buscando nombres de depurador conocidos como gdb o comparándolo con argv[0] ).

Este es un ejemplo que muestra esta variable en acción y en qué 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.

TAMBIÉN TENGA EN CUENTA: El truco es realmente barato y es muy fácil de omitir y tiene una alta probabilidad de no funcionar como es debido (falsos positivos y falsos negativos).

    
respondido por el Alexander O'Mara 20.06.2018 - 02:34
fuente
41

Bash establece la variable de entorno _ en la ruta del comando que se está ejecutando. También lo hacen zsh y pdksh. Pero otros shells, como fish y dash (que es el shell de scripting 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 verificar 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 desea cambiarlo, es absolutamente trivial, simplemente ejecute env -u _ myprogram o env myprogram .

Como las medidas de "anti-depuración" van, esta es bastante ridícula. No solo es falsificable con esfuerzo cero, sino que no funcionaría en el uso normal. Si algún material de lectura lo promociona como una medida anti-depuración, recomendaría que este material sea muy poco confiable.

    
respondido por el Gilles 20.06.2018 - 08:22
fuente

Lea otras preguntas en las etiquetas