bash - compressor - uglify
Cómo minimizar/ofuscar un script de bash (7)
Por supuesto, un archivo bash no puede ser realmente confuso y siempre será legible. Y no quiero envolverlos en algún paquete binario. Y el cambio de nombre de las variables locales no valdría la pena.
Pero, ¿existe un simple ofuscador o minificador bash confiable que al menos elimine toda la sangría, todas las líneas vacías y todo el espacio en blanco sin romper nada? ¿Y especialmente los comentarios y partes comentadas del script que pueden contener documentos o información confidencial?
Tendría miedo de las líneas grep / sed simples para hacer esto porque " HEREDOCs " no deben modificarse, por supuesto, por lo que es necesario un poco de análisis real.
Tal vez haya una herramienta para hacer esto, ¡eso sería genial!
: P aqui hay algo gracioso.
digamos que su script se llama origin
y el ofuscado se llama obsf
.
Aquí está el origin
:
#!/bin/sh
echo "fooo"
aqui esta obsf
$ echo "echo $(base64 origin)" > obsf
$ cat obsf
echo IyEvYmluL3NoCmVjaG8gImZvb28iCg==
$ chmod +x obsf
Ahora rm origin
y ejecute obsf
esta manera:
$ sh obsf | base64 -d | sh
fooo
je: 3
A pesar de que esta es una vieja pregunta, parece ser popular en Google. También estaba buscando un minifer / ofuscador de bash, y no me gustó el de la respuesta.
Yo tampoco quería agregar gibberish, o compilar el script. Así que escribí uno que hizo lo que quería en Perl y lo puse en GitHub en https://github.com/Aralhach/bashobfus/tree/master
Puede:
- Aplanar la muesca
- Eliminar comentarios de línea completa (excepto el hashbang inicial (#!)) Y líneas en blanco
- Renombra todas las variables en minúscula en declaraciones básicas (para evitar el cambio de nombre de variables como PATH), para bucles, acceso a matrices y declaraciones de ''lectura''.
Puede haber algún caso en el que falle, pero lo probé con un script bash bastante grande, y aparecieron los casos enumerados de sustitución de variables. También deja las variables entre comillas simples ('') solo - esto apareció cuando se imprime un script AWK - pero se reemplaza entre comillas simples ('') cuando la declaración ya está entre comillas dobles (") - esto apareció cuando se imprime un Declaración MySQL .
Esto me hace pensar que he cubierto todos los grandes casos de uso, pero me he equivocado antes. Si encuentra algún error, no dude en informarnos (o corregirlo! D). También estaba pensando en agregar una función para unir líneas cortas en una con ";" pero los casos eran demasiados para analizar al hacer mi fecha límite.
Espero que la gente lo encuentre útil!
Aquí hay una herramienta que creé para la minificación de scripts de bash: https://github.com/precious/bash_minifier : intenta eliminar todos los comentarios y tantos espacios / tabulaciones / nuevas líneas como sea posible. También está disponible como servicio aquí https://bash-minifier.appspot.com/ .
Para minimizar su script bash ejecute este comando:
python minifier.py /path/to/shell/script.sh
Archivo original script.sh
:
#!/usr/bin/env bash
echo "foo"
Crear other.sh
$ echo ''#!/usr/bin/env bash'' > other.sh
$ echo "echo ''$(base64 script.sh)'' | base64 -d | sh" >> other.sh
$ chmod +x other.sh
Resultado ( cat other.sh
):
#!/usr/bin/env bash
echo ''IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvICJmb28iCg=='' | base64 -d | sh
Tratar:
$ ./other.sh
foo
Basado en la idea c00kiemon5ter, aquí tienes el script
Sus retorcidas mentes recursivas lo amarán, ya que este no es el guión original, sino el ofuscado (ofuscado (original))
#!/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}
La minificación y la ofuscación de un script de shell son dos cosas diferentes.
Minificación significa reducir el tamaño de un script eliminando todos los caracteres innecesarios del código fuente sin cambiar su funcionalidad. La ofuscación por otra parte significa hacer que el guión sea difícil, si no imposible, de leer.
Minificación:
Para minimizar una secuencia de comandos grande, puede ejecutar el siguiente código contra la secuencia de comandos real que desea reducir:
#!/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
Tenga en cuenta que la minificación tiende a marcar la diferencia solo si el script que se está minando es grande ... con varios cientos o incluso miles de líneas. Pude recortar algunos megabytes de una secuencia de comandos utilizando el código anterior.
Ofuscación:
Una vez que se completa la reducción anterior, puedes detenerte allí mismo si lo que buscas es la reducción de tamaño. Sin embargo, si después de la reducción, también desea ofuscar su script, tiene opciones.
La forma más sencilla de ofuscar su script es mediante el uso de herramientas de cifrado como 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
Encriptación / ofuscación:
- Si su objetivo final es hacer que a otros les resulte difícil leer su script, intente pegarlo aquí para que se genere una copia cifrada para usted.
- En caso de que cambie de opinión sobre SHC, puede descargar la última versión aquí .
Una herramienta para ofuscar scripts de shell: http://www.comp.eonworks.com/scripts/obfuscate_shell_script-20011012.html
Algo tonto que hacer, pero eso depende de ti. También hay formas de "compilar" su script de shell en un ejecutable. post''s respuesta aceptada de esta post''s ofrece varios enlaces con herramientas para hacerlo.