Bash は環境変数 _
を設定します 実行中のコマンドへのパス。 zsh と pdksh も同様です。ただし、fish や dash (多くの Linux ディストリビューションでデフォルトのスクリプト シェル) などの他のシェルでは、これが行われません。 ATT ksh は、コマンドへのパスを含む値に設定します。
アイデアは、プログラムが環境変数 _
の値をチェックできるということです 何がそれを引き起こしたのかを見るために、私は推測します。ただし、ユーザーが何も変更していない場合でも、これは非常に信頼できません。プログラムが GUI またはスクリプト経由で起動された場合、_
空であるか、まったく関係のない値を持つ可能性があります。これは完全に正当であり、非常に一般的です。そしてもちろん、ユーザーがそれを変更したい場合、それはまったく簡単です — env -u _ myprogram
を実行するだけです または env myprogram
.
「アンチデバッグ」対策が進んでいるので、これはかなりばかげています。努力なしでなりすましが可能であるだけでなく、通常の使用では実際には機能しません。一部の読み物がデバッグ対策としてそれを宣伝している場合、私はこの資料を非常に信頼できないものとして推奨しません.
このコンテキストでは、_
通常、環境変数には、プログラム自体ではなく、プログラムを開始したデバッガーへのパスが含まれます。デバッガーを検出しようとするプログラムは、その変数を読み取り、デバッガーが検出された場合 (おそらく gdb
のような既知のデバッガー名を探すことによって) 異なる動作をすることができます。 または argv[0]
と比較して ).
この変数の動作と、argv[0]
との違いを示す例を次に示します。 :
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;
}
シェル出力:
$ 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)
注:これは Linux に固有のものではなく、macOS やおそらく他の POSIX システムでも実行できます。
また注意:これは非常に安価なトリックであり、回避するのは非常に簡単であり、意図したとおりに機能しない可能性が高くなります (偽陽性と偽陰性の両方)。