SHC - Compilador de Shell Script

Trucos y Utilidades 18 de jul. de 2023

Seguramente que en algún momento de tu trabajo informático te hayas encontrado con que te gustaría codificar, ofuscar o incluso encriptar tus scripts de bash.
La solución se llama Shell script Compiler.

En Debian la instalación es muy sencilla:

sudo apt -y install shc
Para otras distribuciones que no dispongan de este programa o si queréis compilarlo vosotros mismos, lo podéis obtener en su git: https://github.com/neurobin/shc

SHC es un compilador de scripts de shell genérico. Procesa el script que se indique en la línea de comando y produce código fuente en C.
Despues ese código fuente generado lo compila y se genera un binario.

El binario compilado seguirá dependiendo de la shell especificada en la primera línea del código de shell, por lo que shc no crea binarios completamente independientes, simplemente codifica y encripta el script.

Otra de sus ventajas es la capacidad de poder indicar una fecha de caducidad al binario generado.

Creación de un Script y Compilación

Vamos a crearnos un script en bash y generaremos su binario.

Además de compilar un fichero, voy a aprovechar para contaros una forma de  ordenar un array desde bash y además eliminar los valores duplicados...

#!/bin/bash
if [ "$1" == "" ]
then
	echo "Error: Debe indicar una lista/array de elementos a ordenar"
    exit 1
fi
RECIBIDO=( $* )
ORDENADO=$(printf "%s\n" "${RECIBIDO[@]}" | sort -u)
echo $ORDENADO
array-sort.sh - Script BASH que ordena un array y elimina duplicados

Ahora podemos usar este script de varias formas desde la shell:

# Creamos un ARRAY de marcas de coches
COCHES=(ford renault open tesla seat)

# Le pasamos el array completo al script y devuelve valores ordenados
./array-sort.sh ${COCHES[@]}
ford open renault seat tesla

# Guardar el resultado en el mismo arrray 'COCHES'
COCHES=( $(./array-sort.sh  ${COCHES[@]}) )

# Tambien funciona pasandole una serie de valores como parametros:
./array-sort.sh  99 3 56 14 2
2 3 14 56 99

# Ordenar valores de un Array y otros valores extra indicados
./array-sort.sh  ${COCHES[@]} bmw toyota bmw toyota
bmw ford open renault seat tesla toyota

Compilamos el script
Lo primero que haremos será ver las opciones que nos proporciona shc, para ello escribimos shc -h, para que nos muestre la ayuda.
Muestro solamente algunas de las opciones que se pueden usar:

shc -h
shc Version 4.0.3, Generic Shell Script Compiler
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f script

    -e %s  Expiration date in dd/mm/yyyy format [none]
    -m %s  Message to display upon expiration ["Please contact your provider"]
    -f %s  File name of the script to compile
    -l %s  Last shell option i.e: --
    -o %s  output filename
    -r     Relax security. Make a redistributable binary
    -H     Hardening : extra security protection [no]
           Require bourne shell (sh) and parameters are not supported
    -B     Compile for busybox
    -h     Display help and exit
Algunas de las opciones de shc

Para compilar nuestro script de nombre "array-sort.sh" escribiremos:

# Compilar y generar binario de nombre 'array-sort'
shc -o array-sort -f array-sort.sh

# Compilar binario 'caducado' al que fijamos una fecha de caducidad
shc -o caducado -e 10/10/2010 -m "Este programa ya no funciona" -f array-sort.sh
Compilando con SHC

Ahora vamos a ver como se comportan los dos binarios creados a partir del mismo script:

# Ejecución del Binario obtenido 
./array-sort  0 39 32 23
  0 23 32 39

# Ejecución del Binario al indicamos que caducó en el 2010
./caducado  0 39 32 23
  ./caducado: has expired!
  Este programa ya no funciona
Como el programa está 'encriptado', no podremos obtener ningún dato del mismo incluso si ejecutamos el comando strings sobre él.
Además, si alguien intentase realizar un dump & trace para obtener alguna traza, el programa se auto protege y aborta la ejecución.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux