Bash shell обфускатор
Запутывание может быть только препятствием, но никогда полностью не останавит кого-то от понимания или изменения закодированного кода. Я бы настоятельно не советовал вам запутываться. Но если вы чувствуете себя лучше таким образом, вы можете использовать следующий подход.
Вы можете сжать свой сценарий A и встроить сжатую версию в другой сценарий B. При выполнении B он распаковывается и выполняет A. С точки зрения безопасности этот подход так же плох, как и ваш связанный метод обфускации. Сжатие легко отменить. Однако здесь нет таких недостатков, как коллизии имен и предварительная обработка. Кроме того, запутанные скрипты кажутся двоичными файлами, которые могут помешать некоторым редакторам открыть их.
Вот скрипт для кодирования bash скриптов с помощью сжатия gzip:
#! /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
).