Kali Linux: Trabajar con libsmali-java
Kali Linux: Trabajar con libsmali-java
Para trabajar con libsmali-java en Kali Linux, lo primero que debes entender es que esta librería es el corazón de herramientas como smali y baksmali. Se utiliza principalmente para el montaje y desmontaje de archivos DEX (Dalvik Executable) que usan las aplicaciones de Android.
Aquí tienes una guía rápida para instalarla y entender sus funciones principales.
1. Instalación en Kali Linux
Kali suele tener estas herramientas en sus repositorios oficiales. Puedes instalar el paquete completo de smali (que incluye la librería) con el siguiente comando:
sudo apt update
sudo apt install smali
Si necesitas la librería .jar específica para desarrollar una herramienta propia en Java, generalmente la encontrarás en /usr/share/java/smali.jar.
2. Componentes principales
La librería se divide en dos funciones críticas para la ingeniería inversa de Android:
| Componente | Función | Analogía |
| baksmali | Desensambla archivos .dex o .odex en código Smali. | De "binario" a "código legible". |
| smali | Ensambla archivos .smali de vuelta a un archivo .dex. | De "código editado" a "binario ejecutable". |
3. Uso básico por terminal
Aunque es una librería de Java, lo más común es interactuar con ella mediante comandos:
Para desensamblar un APK (u obtener el código Smali):
Bashbaksmali d mi_aplicacion.dex -o carpeta_salidaPara volver a ensamblar los archivos editados:
Bashsmali a carpeta_salida -o classes.dex
4. ¿Por qué usar Smali en lugar de Java directamente?
Cuando usas herramientas como jadx para ver código Java, a veces la reconstrucción no es perfecta y el código no se puede volver a compilar.
Smali es una representación de bajo nivel (similar al lenguaje Ensamblador) que:
Es fiel al 100% a lo que ejecuta la máquina virtual Dalvik.
Permite modificar el comportamiento de una app (por ejemplo, saltar una verificación de licencia) y volver a empaquetarla sin errores de compilación.
Consideración importante
Si tu objetivo es simplemente ver el código fuente para entender qué hace una app, quizás te resulte más cómodo usar Bytecode Viewer o JADX, que también vienen preinstalados en Kali. libsmali es para cuando necesitas "ensuciarte las manos" y modificar el binario.
Aquí tienes un pequeño script en Bash que puedes guardar en tu Kali Linux para automatizar el flujo de trabajo. Este script detecta si quieres desensamblar o ensamblar basándose en si le pasas un archivo o una carpeta.
Script: smali-helper.sh
Copia este código en un archivo nuevo:
#!/bin/bash
# Colores para la terminal
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # Sin color
if [ -f "$1" ]; then
echo -e "${BLUE}[*] Archivo detectado. Desensamblando (baksmali)...${NC}"
# d = decompile/disassemble
baksmali d "$1" -o "${1%.*}_out"
echo -e "${GREEN}[+] Hecho. Código smali en: ${1%.*}_out${NC}"
elif [ -d "$1" ]; then
echo -e "${BLUE}[*] Carpeta detectada. Ensamblando (smali)...${NC}"
# a = assemble
smali a "$1" -o "${1%_out}_nuevo.dex"
echo -e "${GREEN}[+] Hecho. Archivo generado: ${1%_out}_nuevo.dex${NC}"
else
echo "Uso: ./smali-helper.sh <archivo.dex o carpeta_smali>"
fi
Cómo prepararlo y usarlo
Dale permisos de ejecución:
Abre la terminal y escribe:
chmod +x smali-helper.shPara desensamblar un .dex:
./smali-helper.sh classes.dex(creará una carpeta llamadaclasses_out).Para volver a crear el .dex tras editarlo:
./smali-helper.sh classes_out(creará un archivo llamadoclasses_nuevo.dex).
¿Qué sucede "bajo el capó"?
Cuando desensamblas, la librería libsmali-java traduce los opcodes binarios de Android a una sintaxis que los humanos podemos leer. Es muy parecido al lenguaje ensamblador tradicional, donde cada línea corresponde a una operación directa del procesador (en este caso, de la Máquina Virtual Dalvik).
Un pequeño truco extra
Si vas a modificar aplicaciones completas frecuentemente, te recomiendo instalar también apktool. Esta herramienta utiliza internamente libsmali-java pero te ahorra el trabajo de extraer manualmente el archivo classes.dex del APK, ya que lo hace todo en un solo paso:
apktool d aplicacion.apk(Desmonta todo)apktool b carpeta_aplicacion(Monta todo de nuevo)