Как минимизировать / запутать скрипт bash [закрыто]
конечно, файл bash не может быть действительно запутанным и всегда будет читаемым. И я не хочу упаковывать их в какой-то бинарный пакет. И переименование локальных переменных не стоит.
но есть ли надежный простой bash obfuscator или minifier, который, по крайней мере, удаляет все отступы, все пустые строки и все пробелы, ничего не нарушая? И особенно комментарии и закомментированные части скрипта, которые могут содержать конфиденциальные документы или информацию?
Я бы боялся простых grep / sed-линий, чтобы сделать это, потому что"HEREDOCs " не должно быть изменено, конечно, так что немного реального разбора необходимо.
может быть, есть инструмент для этого, это было бы здорово!
7 ответов
вот инструмент, который я создал для минимизации скриптов bash:https://github.com/precious/bash_minifier - он пытается удалить все комментарии и как можно больше пробелов / вкладок / новых строк. Он также доступен как сервис здесь https://bash-minifier.appspot.com/.
чтобы минимизировать сценарий bash, выполните следующую команду:
python minifier.py /path/to/shell/script.sh
: P вот что забавно.
скажите, что ваш скрипт называется origin
и запутавшегося зовут obsf
.
здесь origin
:
#!/bin/sh
echo "fooo"
здесь obsf
$ echo "echo $(base64 origin)" > obsf
$ cat obsf
echo IyEvYmluL3NoCmVjaG8gImZvb28iCg==
$ chmod +x obsf
теперь rm origin
и работать obsf
такой:
$ sh obsf | base64 -d | sh
fooo
хех :3
хотя это старый вопрос, он, кажется, популярен в Google. Я также искал bash minifer / obfuscator, и мне не понравился ответ.
Я тоже не хотел добавлять тарабарщину или компилировать сценарий. Поэтому я написал тот, который сделал то, что я хотел в Perl, и поместил его на GitHub в https://github.com/Aralhach/bashobfus/tree/master
можно:
- выровнять вмятины
- удалить все комментарии (кроме начального hashbang (#!)) и пустые строки
- переименовывает все строчные переменные в основных объявлениях (чтобы избежать переименования переменных, таких как PATH), для циклов, доступа к массиву и операторов "read".
может быть какой-то случай, когда он терпит неудачу, но я тестировал его с довольно большим скриптом bash, и появились перечисленные случаи замены переменных. Это тоже оставляет переменные в одинарных кавычках ( ' ) в одиночку --это выскочило при печати сценария AWK-- но заменяет между одинарными кавычками ( ' ), когда заявление уже находится внутри двойных кавычек (") --это выскочило при печати оператора MySQL.
Это заставляет меня думать, что я охватил все большие случаи использования, но я ошибался раньше. Если вы нашли какие-либо ошибки, не стесняйтесь сообщать о них (или исправить их! :Д.) Я также думал добавить функцию, чтобы объединить короткие строки в одну с"; " но случаи были слишком много анализировать, делая свой срок.
Я надеюсь, что люди найдут его полезным!
инструмент для обфускации скриптов : http://www.comp.eonworks.com/scripts/obfuscate_shell_script-20011012.html
вроде как глупо, но это зависит от вас. Существуют также способы "скомпилировать" сценарий оболочки в исполняемый файл. Это пост принятый ответ дает несколько ссылок с инструментами для этого.
минимизация и обфускация скрипта-это две разные вещи.
Minification означает уменьшение размера скрипта путем удаления всех ненужных символов из исходного кода без изменения его функциональности. С другой стороны, запутывание означает затруднение, если не невозможность, чтения сценария.
Minification:
минимизировать большой скрипт, вы можете запустить следующий код на фактический код, который вы хотите код:
#!/bin/sh
Script=
if [ ! -z "${Script}" ] && [ -f ${Script} ] ; then
CurrenTime=$(date | sed -e 's~ ~_~g' -e 's~:~~g')
cp ${Script} ${Script}_${CurrenTime}
#### Remove all empty lines
#### Remove lines that begin with spaces and a comment sign #
#### Remove all comment lines (meaning, lines that begin with a "#")
awk '
(/.*/ || /#!/) && (!/^#$/) &&
(!/^#[[:blank:]]/) && (!/^#[a-z]/) &&
(!/^#[A-Z]/) && (!/^##/) &&
(!/^\t#/) && (!/^[[:space:]]*$/) &&
( /^#.*!/ || !/^[[:space:]]*#/)
' ${Script} | sed 's_^[[:space:]]*__g' > ${Script}.tmp 2>/dev/null
#' ${Script} > ${Script}.tmp 2>/dev/null (comment out the above line and uncomment this line if your HEREDOCS are affected)
ExitCode=$?
if [ ${ExitCode} -eq 0 ] && [ -s ${Script}.tmp ] ; then
echo
echo "SUCCESS: Your newly [ minified ] script can be found here [ ${Script}.tmp ]."
echo "Review the script [ ${Script}.tmp ] and if happy with it, replace your original script with it!"
echo "NOTE: Your original script [ ${Script} ] was backed up as [ ${Script}_${CurrenTime} ]!"
echo
exit 0
else
echo
echo "FAILURE: Unable to [ minify ] the specified script [ ${Script} ]!!!"
echo
exit 2
fi
else
echo
echo "USAGE: <your-script>"
echo
exit 3
fi
обратите внимание, что минимизация имеет тенденцию иметь значение только в том случае, если сценарий минимизируется большой...с несколькими сотнями или даже тысячами строк. Я смог обрезать несколько мегабайт из скрипта, используя приведенный выше код.
обфускации:
после завершения вышеуказанного минимизации вы можете просто остановиться прямо там, если уменьшение размера-это то, что вы собираетесь. Если однако, после minification, вы также желаете запутать ваше скрипт также у вас есть варианты.
самый простой способ запутать ваш скрипт - использовать инструменты шифрования, такие как Openssl.
To encrypt your script using Openssl:
1. cat <your-script> | openssl aes-128-cbc -a -salt -k "specify-a-password" > yourscript.enc
OR
2. openssl aes-128-cbc -a-salt -in <path-to-your-script> -k "yourpassword"
To decrypt a script using Openssl (notice the '-d'):
1. cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k "specify-a-password" > yourscript.dec
OR
2. openssl aes-128-cbc -a -d -salt -in <path-to-your-script> -k "yourpassword" > yourscript.dec
Шифрование/Обфускация:
- если ваша конечная цель состоит в том, чтобы затруднить другим читать ваш сценарий, попробуйте вставить вот это для создания зашифрованной копии.
- в случае, если вы передумаете о SHC, последняя версия может быть скачать тут.
исходный файл script.sh
:
#!/usr/bin/env bash
echo "foo"
создать other.sh
$ echo '#!/usr/bin/env bash' > other.sh
$ echo "echo '$(base64 script.sh)' | base64 -d | sh" >> other.sh
$ chmod +x other.sh
результат (cat other.sh
):
#!/usr/bin/env bash
echo 'IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvICJmb28iCg==' | base64 -d | sh
попробуй:
$ ./other.sh
foo
на основе идеи c00kiemon5ter, здесь у вас есть скрипт
ваши искаженные рекурсивные умы будут любить его, так как это не оригинальный сценарий, а запутанный(запутанный(оригинальный))
#!/bin/bash
#
# Usage:
# obfuscate scrript.sh > script_obfuscated.sh
#
PIXIE=$(mktemp)
base64 -d >${PIXIE}<<DIXIE
IyEvYmluL2Jhc2ggClBJWElFPSQobWt0ZW1wKQpiYXNlNjQgLWQgID4ke1BJWElFfTw8RElYSUUK
SXlFdlltbHVMMkpoYzJnS2FXWWdXeUFnTFdZZ0lpUXhJaUJkSUFwMGFHVnVDbU5oZENBOFBGQkpX
RWxGSUFvaklTOWlhVzR2WW1GegphQ0FLVUVsWVNVVTlYQ1FvYld0MFpXMXdLUXBpWVhObE5qUWdM
V1FnSUQ1Y0pIdFFTVmhKUlgwOFBFUkpXRWxGQ2lRb1ltRnpaVFkwCklDUXhLUXBFU1ZoSlJRcHpi
M1Z5WTJVZ1hDUjdVRWxZU1VWOUNuSnRJQzF5WmlCY0pIdFFTVmhKUlgwS1VFbFlTVVVLWlhocGRD
QXcKQ21acENtTmhkRHc4VGtWU1JBb2dJQ0IxYzJGblpUb2diMkoxYzJOaGRHVWdjMk55YVhCMENn
b2dJQ0JYYVd4c0lHZGxibVZ5WVhSbApJQ0p6WTNKcGNIUXViMkp6YUNJS1RrVlNSQW89CkRJWElF
CnNvdXJjZSAke1BJWElFfQpybSAtcmYgJHtQSVhJRX0K
DIXIE
source ${PIXIE}
rm -rf ${PIXIE}