web-dev-qa-db-fra.com

Comment réduire / obscurcir un script bash

Bien sûr, un fichier bash ne peut pas être vraiment obscurci et sera toujours lisible. Et je ne veux pas les envelopper dans un paquet binaire. Et renommer des variables locales ne valait pas la peine.

Mais y a-t-il un simple obfuscateur ou minificateur bash fiable qui supprime au moins toutes les indentations, toutes les lignes vides et tous les espaces sans rien casser? Et surtout les commentaires et les parties commentées du script qui pourraient contenir des documents ou des informations sensibles?

J'aurais peur de simples lignes grep/sed pour le faire car " HEREDOCs " ne doit pas être modifié bien sûr, donc un peu d'analyse réelle est nécessaire.

Peut-être qu'il y a un outil pour le faire, ce serait génial!

22
Christian

Voici un outil que j'ai créé pour la minification des scripts bash: https://github.com/precious/bash_minifier - il essaie de supprimer tous les commentaires et comme autant d'espaces/tabulations/nouvelles lignes que possible. Il est également disponible en tant que service ici https://bash-minifier.appspot.com/ .

Pour réduire votre script bash, exécutez cette commande:

python minifier.py /path/to/Shell/script.sh
10
Vsevolod Kulaga

: P voici quelque chose de drôle.

disons que votre script est nommé Origin et que celui qui est obscurci est nommé obsf.

voici Origin:

#!/bin/sh
echo "fooo"

voici obsf

$ echo "echo $(base64 Origin)" > obsf
$ cat obsf
echo IyEvYmluL3NoCmVjaG8gImZvb28iCg==
$ chmod +x obsf

maintenant rm Origin et exécutez obsf comme ceci:

$ sh obsf | base64 -d | sh
fooo

heh: 3

28
c00kiemon5ter

Même s'il s'agit d'une vieille question, elle semble être populaire sur Google. Je cherchais également un minifer/obfuscator bash, et je n'ai pas aimé celui dans la réponse.

Je ne voulais pas non plus ajouter du charabia ou compiler le script. J'en ai donc écrit un qui a fait ce que je voulais en Perl, et je l'ai mis sur GitHub à https://github.com/Aralhach/bashobfus/tree/master
Ça peut:

  • Aplatir l'indentation
  • Supprimez les commentaires de ligne complète (sauf le hashbang initial (#!)) Et les lignes vides
  • Renomme toutes les variables en minuscules dans les déclarations de base (pour éviter de renommer des variables comme PATH), pour les boucles, l'accès aux tableaux et les instructions 'read'.

Il peut y avoir un cas où il échoue, mais je l'ai testé avec un script bash assez gros et les cas répertoriés de remplacement de variable sont apparus. Il laisse également les variables entre guillemets simples (') seules - cela s'affichait lors de l'impression d'un script AWK - mais remplace entre guillemets simples (') lorsque l'instruction est déjà entre guillemets doubles (") - ceci est apparu lors de l'impression d'un MySQL .

Cela me fait penser que j'ai couvert tous les grands cas d'utilisation, mais je me suis trompé avant. Si vous trouvez des bugs, n'hésitez pas à les signaler (ou à les corriger!: D). Je pensais également à ajouter une fonctionnalité pour joindre des lignes courtes en une seule avec ";" mais les cas étaient trop nombreux pour être analysés en faisant mon délai.

J'espère que les gens le trouveront utile!

7
Daniel Gray

Fichier d'origine script.sh:

#!/usr/bin/env bash
echo "foo"

Créer other.sh

$ echo '#!/usr/bin/env bash' > other.sh
$ echo "echo '$(base64 script.sh)' | base64 -d | sh" >> other.sh
$ chmod +x other.sh

Résultat (cat other.sh):

#!/usr/bin/env bash
echo 'IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvICJmb28iCg==' | base64 -d | sh

Essayer:

$ ./other.sh
foo
5
Eduardo Cuomo

Un outil pour obscurcir les scripts Shell: http://www.comp.eonworks.com/scripts/obfuscate_Shell_script-20011012.html

C'est idiot de le faire, mais ça dépend de vous. Il existe également des moyens de "compiler" votre script Shell dans un exécutable. Cette réponse réponse acceptée donne plusieurs liens avec des outils pour le faire.

2
linuxnut

La minimisation et l'obscurcissement d'un script Shell sont deux choses différentes.

La minification signifie réduire la taille d'un script en supprimant tous les caractères inutiles du code source sans modifier sa fonctionnalité. L'obscurcissement, d'autre part, signifie rendre le script difficile, voire impossible, à lire.

Minification:

Pour réduire un gros script, vous pouvez exécuter le code suivant par rapport au script réel que vous souhaitez réduire:

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

Remarque, la minification a tendance à faire une différence uniquement si le script en cours de minification est gros ... avec plusieurs centaines voire des milliers de lignes. J'ai pu couper quelques mégaoctets d'un script en utilisant le code ci-dessus.

Obfuscation:

Une fois la minification ci-dessus terminée, vous pouvez simplement vous arrêter si la réduction de taille est ce que vous recherchez. Si toutefois, après la minification, vous souhaitez également masquer votre script, vous avez des options.

Le moyen le plus simple d'obscurcir votre script consiste à utiliser des outils de chiffrement tels que 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

Cryptage/obscurcissement:

  1. Si votre but ultime est de rendre la lecture de votre script difficile, essayez en le collant ici pour avoir une copie cryptée générée pour vous.
  2. Si vous changez d'avis sur SHC, la dernière version peut être téléchargée ici .
1
RoyMWell