Linux
June 2, 2022

Bash shell обфускатор

Запутывание может быть только препятствием, но никогда полностью не останавит кого-то от понимания или изменения закодированного кода. Я бы настоятельно не советовал вам запутываться. Но если вы чувствуете себя лучше таким образом, вы можете использовать следующий подход.

Вы можете сжать свой сценарий A и встроить сжатую версию в другой сценарий B. При выполнении B он распаковывается и выполняет A. С точки зрения безопасности этот подход так же плох, как и ваш связанный метод обфускации. Сжатие легко отменить. Однако здесь нет таких недостатков, как коллизии имен и предварительная обработка. Кроме того, запутанные скрипты кажутся двоичными файлами, которые могут помешать некоторым редакторам открыть их.

Вот скрипт для кодирования bash скриптов с помощью сжатия gzip:

obfuscate.sh:

#! /bin/bash
loader='#! /bin/bash
source <(gzip -c -d <(tail -n+"$((LINENO + 2))" "$BASH_SOURCE"));
status="$?"; return "$status" 2> /dev/null || exit "$status"
'
for original; do
        obfuscated="$original-obfuscated.sh"
        gzip -c "$original" | cat <(printf %s "$loader") - > "$obfuscated"
        chmod u+x "$obfuscated"
done

Использование: ./obfuscate.sh myScript.sh создает запутанный скрипт myScript.sh-obfuscated.sh в текущем каталоге.

Если целевая система не поддерживает подстановку процессов <( ) , вы можете использовать следующую альтернативную версию.

#! /bin/bash
loader='#! /bin/bash
tail -n+"$((LINENO + 2))" "$BASH_SOURCE" | gzip -c -d | source /dev/stdin;
status="$?"; return "$status" 2> /dev/null || exit "$status"
'
for original; do
        obfuscated="$original-obfuscated.sh"
        printf %s "$loader" > "$obfuscated"
        gzip -c "$original" >> "$obfuscated"
        chmod u+x "$obfuscated"
done

Это должно сработать, если целевая система имеет bash >4.0 и /dev/stdin . Если она не соответствует этим требованиям, замените | source /dev/stdin на bash -s - "$@" . Единственным недостатком этого является то, что запутанный сценарий больше не может быть получен ( . script.sh или source script.sh).