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!
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
: 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
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:
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!
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
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.
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: