Как минимизировать / запутать скрипт 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

Шифрование/Обфускация:

  1. если ваша конечная цель состоит в том, чтобы затруднить другим читать ваш сценарий, попробуйте вставить вот это для создания зашифрованной копии.
  2. в случае, если вы передумаете о 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}