June 2007

Script autoextraíble

Intentando enviar un archivo zip con ejecutables dentro por gmail, se me ocurrió un sistema para hacer un script autoextraíble. He visto algunos por ahí pero el código que meten es bastante feo y grande, y yo quería algo sencillo para un sólo uso.
La idea es colocar el archivo a extraer a continuación del “exit” del script, y hacer que el script lo saque a otro archivo. Para sacarlo, utiliza dd, el origen es el propio archivo y el destino es el archivo incrustado. Se saltan tantos bytes como ocupe la parte “ejecutable” del script a la hora de sacar la información.
El código del script es sencillo:

#!/bin/bash
dd if=$0 of=nombreIncrustado bs=1 skip=$(( `grep -a -b -x exit $0 | cut -f1 -d:` + 5 )) 2> /dev/null
exit

Lo más complicado sería tal vez el grep: La opción a evita que salga lo de “Coincidencia en archivo binario”, la -b hace que el valor devuelto sea el offset en bytes hasta el principio del match y la x hace que sólo casen líneas completas. De lo que nos devuelve el grep nos quedamos con la primera columna, que es el offset y le sumamos 5 (4 bytes de longitud del exit y 1 más para el final de línea).
Luego simplemente nos saltamos esa cantidad de bloques al hacer la copia y así sacamos todo lo que está después del exit a otro archivo.
Para incrustar el binario dentro del script, simplemente hacemos

#> cat script.sh binario > script.run

Con darle permisos de ejecución ya tenemos un script autoextraíble, que, por cierto, el gmail y demás correos onlines no detecta como archivo peligroso ;)
Saludos y suerte

Uncategorized

Comments (0)

Permalink

Declarar structs a lo pro

Curioseando las cosas del kernel, me he encontré hace unos días con una construcción de los structs que no conocía, y que es bastante útil cuando tienes un struct muy grande con muchos campos, y que no necesitas utilizar todos cada vez que lo declaras, o que lo declaras con unos pocos:

typedef struct __chona__ {
int a;
int b;
} chona_t;
/* ejemplo de uso */
int main () {
chona_t chona = {
.a = 1
};
printf("*** Chona vale a: %d - b: %d \n", chona.a, chona.b);
}

Como se ve, usando un punto seguido del nombre del campo se puede referenciar a ese campo, y si no está referenciado, se pone a NULL.
Mucho cuidado, esta sintaxis pertenece a C99, el último estándar de C, lo que requiere un compilador relativamente reciente (gcc 2.95 ya lo soportaba…).
En fin, suerte y no traten de usar esto para ligar en las discotecas.

Uncategorized

Comments (2)

Permalink