Bash nastavuje proměnnou prostředí _
na cestu k příkazu, který se provádí. Stejně tak zsh a pdksh. Ale jiné shelly, jako fish and dash (což je výchozí skriptovací shell na mnoha distribucích Linuxu), to nedělají. ATT ksh jej nastaví na hodnotu, která obsahuje cestu k příkazu.
Myšlenka je, že program může zkontrolovat hodnotu proměnné prostředí _
abych viděl, co to vyvolalo, myslím. Až na to, že je to extrémně nespolehlivé, i když uživatel nedělá nic, aby to změnil. Pokud je program spuštěn z GUI nebo pomocí skriptu, _
může být prázdný nebo může mít nějakou zcela nesouvisející hodnotu, a to je naprosto legitimní a velmi běžné. A samozřejmě, pokud to uživatel chce změnit, je to naprosto triviální – stačí spustit env -u _ myprogram
nebo env myprogram
.
Vzhledem k tomu, že opatření proti ladění jdou, je toto docela směšné. Nejen, že je spoofovatelný s nulovou námahou, ale při běžném používání by vlastně ani nefungoval. Pokud to nějaký materiál ke čtení nabízí jako opatření proti ladění, doporučil bych tento materiál jako velmi nespolehlivý.
V tomto kontextu _
Proměnná prostředí bude obvykle obsahovat cestu k debuggeru, který spustil program, spíše než samotný program. Program, který se pokouší detekovat ladicí program, pak může číst tuto proměnnou a chovat se jinak, pokud ladicí program uvidí (možná vyhledáním známých názvů ladicího programu jako gdb
nebo porovnáním s argv[0]
).
Zde je příklad, který ukazuje tuto proměnnou v akci a jak se liší od argv[0]
:
C kód:
#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;
}
Výstup shellu:
$ 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)
POZNÁMKA:Toto není jedinečné pro Linux, můžete to udělat na macOS a pravděpodobně i na jiných systémech POSIX.
TAKÉ:Jedná se o opravdu levný trik, který lze opravdu snadno obejít a má vysokou šanci, že nebude fungovat tak, jak bylo zamýšleno (falešně pozitivní i falešně negativní).