Как минимизировать/обфускать bash script - программирование
Подтвердить что ты не робот

Как минимизировать/обфускать bash script

Конечно, файл bash не может быть действительно запутанным и всегда будет читаемым. И я не хочу обертывать их в какой-то двоичный пакет. И переименование локальных переменных не стоило бы проблем.

Но есть ли надежный простой obfuscator bash или minifier, который, по крайней мере, удаляет все отступы, все пустые строки и все пробелы, не нарушая ничего? И особенно комментарии и комментарии частей script, которые могут содержать конфиденциальные документы или информацию?

Я бы боялся простых grep/sed-строк, потому что " HEREDOCs", конечно, не нужно изменять, поэтому немного бит реального анализа.

Может быть, есть инструмент для этого, это было бы здорово!

4b9b3361

Ответ 1

Вот инструмент, который я создал для минимизации скриптов bash: https://github.com/precious/bash_minifier - он пытается удалить все комментарии и столько же пробелы/вкладки/новые строки. Он также доступен в качестве сервиса здесь https:// bash - minifier.appspot.com/.

Чтобы минимизировать ваш bash script, выполните следующую команду:

python minifier.py /path/to/shell/script.sh

Ответ 2

: P здесь что-то смешное.

скажите, что ваш script имеет имя 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

heh: 3

Ответ 3

Несмотря на то, что это старый вопрос, он, похоже, популярен в Google. Я также искал bash minifer/obfuscator и не любил ответ в ответ.

Я тоже не хотел добавлять тарабарщину или компилировать script. Поэтому я написал один, который сделал то, что я хотел в Perl, и поместил его в GitHub на https://github.com/Aralhach/bashobfus/tree/master
Это может:

  • Сгладить углубление
  • Удалить полнотекстовые комментарии (кроме начального хешбанга (#!)) и пустых строк
  • Переименовывает все строчные переменные в базовых объявлениях (чтобы избежать переименования переменных, таких как PATH), для циклов, доступа к массиву и "чтения".

Может быть, в каком-то случае, когда он терпит неудачу, но я тестировал его с довольно большим bash script, и появлялись случаи замены переменных. Он также оставляет переменные только в одиночных кавычках (') - это вызывается при печати AWK script - но заменяет одиночные кавычки ('), когда оператор уже находится внутри double quotes ( ") - это появилось при печати инструкции MySQL.

Это заставляет меня думать, что я освещал все большие варианты использования, но раньше я ошибался. Если вы найдете какие-либо ошибки, не стесняйтесь сообщать о них (или исправить их!). Я также думал о добавлении функции для объединения коротких строк в один с ";" но случаев было слишком много, чтобы анализировать, делая мой срок.

Я надеюсь, что люди сочтут это полезным!

Ответ 4

A Инструмент для обфускации сценариев оболочки: http://www.comp.eonworks.com/scripts/obfuscate_shell_script-20011012.html

Открой глупость, но это до тебя. Существуют также способы "скомпилировать" оболочку script в исполняемый файл. Этот принятый ответ содержит несколько ссылок с инструментами для этого.

Ответ 5

Минирование и обфускация оболочки script - это две разные вещи.

Минимизация означает уменьшение размера script путем удаления всех ненужных символов из исходного кода без изменения его функциональности. С другой стороны, обфускация означает, что читать script трудно, если не невозможно.

минификация:

Чтобы минимизировать большой script, вы можете запустить следующий код против фактического script, который вы хотите минимизировать:

#!/bin/sh
Script=${1}
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: ${0}  <your-script>"
        echo
        exit 3
fi

Примечание. Минализация имеет тенденцию иметь значение только в том случае, если script является миниатюрной величиной... с несколькими сотнями или даже тысячами строк. Я смог обрезать несколько мегабайт от script, используя приведенный выше код.

Obfuscation:

После того, как вышеуказанная минификация завершена, вы можете просто остановиться прямо там, если будет уменьшено количество уменьшенных размеров. Если, однако, после минимизации, вы также хотите обфускать свой script, у вас есть варианты.

Самый простой способ обмануть ваш script - это использование инструментов шифрования, таких как 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

Шифрование /Obfuscation:

  • Если ваша конечная цель состоит в том, чтобы заставить других читать ваши script, попробуйте вставить его здесь, чтобы получить зашифрованную копию для вас.
  • Если вы передумаете о SHC, последняя версия может быть загружена здесь.

Ответ 6

Исходный файл 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

Try:

$ ./other.sh
foo

Ответ 7

Основываясь на идее c00kiemon5ter, здесь у вас есть script

Ваши искаженные рекурсивные умы будут любить его, поскольку это не оригинал script, а запутанный (обфускационный (оригинальный))

#!/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}