Destripando aplicaciones en Android: Final

Seguimos, destripando nuestras aplicaciones android, en el anterior articulo,vimos como de-compilar nuestro apk, pero que es realmente un ¿apk?

Estructura de apk(Android application package)

Imagen de https://justamomentgoose.wordpress.com/

Las aplicaciones android, se distribuyen en formato apk, que no es mas un contenedor zip que esta basado en un contenedor de archivos java, esta estructura una vez desensamblada nos muestra los siguientes archivos contenidos:

  • META-INF: En este directorio nos encontramos varios archivos MANIFEST.MF: El archivo manifiesto de la aplicación
  • CERT.RSA: El certificado de la aplicación. CERT.SF: Listas de recursos necesarios y su correspondiente clave sha-1
  • LIB: En este directorio nos encontramos el código compilado especifico de del software o el procesador.
  • RES: Este directorio contiene los recursos no compilados dentro de resources.arsc
  • ASSETS:Este directorio contiene los assets de la aplicación.
  • ANDROIDMANIFEST.xml:Este archivo es el que contiene las especificaciones de permisos,versiones y librerías referenciadas que necesita nuestra aplicación, este archivo es interpretado por android, pero si lo hemos decompilado usando apktool, como vimos en al anterior tutorial, podremos leerlo perfectamente.
  • CLASSES.dex: Este archivo contiene el código java, que sera interpretado por la maquina virtual de android(dalkvid)
  • RESOURCES.arsc: Este archivo contiene todos los recursos precompilados.

Si observamos nuestra aplicación,ya “decodificada” con apktool como vimos en el anterior articulo, veremos que tenemos una estructura de directorios muy similar a la que se comenta, y dentro de ella podremos ver la estructura de la aplicación, así como los ficheros xml que la componen.

Con un rápido vistazo a la estructura, rápidamente nos podremos dar cuenta que el “meollo” de la cuestión este en el archivo classes.dex, puesto que es el que contiene el código de la aplicación, los demás archivos solo se encargan de dar la apariencia y formato adecuado a la misma.

Si observamos en nuestra estructura no encontraremos ningún archivo .dex ¿porque ocurre esto? el código java incluido en el archivo classes.dex es procesado por dalkvid y guardado en su cache, cuando una aplicación esta en ejecución, dalkvid genera un archivo .odex y borra el .dex, por eso no aparece en nuestro sistema. Los archivos .odex dependen de una serie de dependencias que tienen que ser cargadas, estas dependencias residen en /system/framework.

Por lo tanto apktool, no nos vale para desensamblar un fichero que esta en ejecución(aunque si nos valdría para un archivo .dex o apk, que no lo estuviera), para ello tenemos que seguir los siguientes pasos:

Encontrando nuestro archivo .dex

Si queremos obtener nuestro archivo .dex, necesitamos encontrar el archivo .odex generado por dalkvid, y todas sus dependencias, la ruta por defecto es /system/framework.

  • Nos conectamos con adb y copiamos el archivo ClockPackage_ESS.odex

     adb pull /system/app/ClockPackage_ESS.odex /directoriodestino
    
  • Copiamos también las dependencias necesarias de /system/framework(como no sabemos que dependencias son las necesarios copiaremos todas)

    adb pull /system/framework /directoriodestinoframework
    

Baskmali y Smali

este software actúa como ensamblador/desamblador sobre un formato dex, interpretado por la maquina virtual de java

Desensamblando Baskmali

  • Bajamos la ultima versión

       wget https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.2.0.jar
    
  • Desensamblamos el archivo .odex

     java -jar baksmali-2.2.0.jar x ClockPackage_ESS.odex -d /rutaaframework -o /directoriosalidadesamblado
    

Ahora ya tenéis todo el código convertido en archivos .smali donde podréis analizar el código de las de nuestros archivos y modificarlo, si así lo deseamos, también podremos ejecutar herramientas de análisis de código como simplify para buscar código ofuscado en nuestra aplicación o androwarm para comprobar si existe malware en nuestro código.

Si queremos volver a ensamblar nuestros archivo a un fichero .dex o apk, tendremos que usar Smali

Ensamblando con Smali

Para crear nuestro archivo classes.dex necesitamos este programa

  • Bajamos la ultima versión

     wget https://bitbucket.org/JesusFreke/smali/downloads/smali-2.2.0.jar
    
  • Creamos nuestro archivo .dex

     java -jar smali-2.0.0.jar  -o classes.dex /directoriosalidadesamblado
    

Si queremos obtener nuestro archivo jar del archivo .dex podemos hacerlo con dex2jar :

  • Ensamblamos todos los archivo en nuevo apk

    apktool b /directoriosalidadesamblado
    

Ahora podrías pensar que con solo volver a instalar el apk, valdría, pero no es así puesto que la aplicación necesita ser firmada para poder ser instalada correctamente.

keytool

Con esta herramienta incluida en el SDK podemos generar una clave auto-firmada para nuestra aplicación

     keytool -genkeypair -v -keystore ClockPackage.keystore -alias nuevaclave -keyalg RSA \
          -keysize 2048 -validity 10000

Nos pedirá, una password para el certificado y los típicos valores que nos suelen pedir para crear uno(organizacion,localidad,correo,etc..)

Jarsigner

Jarsigner forma parte del SDK de android, por lo que no necesitamos bajarlo, tan solo ejecutarlo de la siguiente manera:

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
            -keystore ClockPackage.keystore nombre.apk nuevaclave

Zipalign

Después de estas modificaciones, necesitamos alinear los bytes correctamente de la siguiente manera:

    zipalign -f -v 4 nombre.apk nuevonombre.apk

Y ya esta

Happy Hacking

Referencias: https://justamomentgoose.files.wordpress.com/2013/06/apk-structure.png https://en.wikipedia.org/wiki/Android_application_package2

puppetmaster Written by:

2 Comments

  1. foo bar
    foo bar
    abril 3
    Reply

    Hasta el desensamblado y ensamblado y más allá. Ya no hay excusa para desenmascarar maliciosos desarrolladores +111110100
    0

  2. […] En anteriores artículos ya estuvimos trasteando y desensamblando aplicaciones en Android en esta vamos a ir un paso mas halla usando los famosos CrackMe. Es imprescindible que para entender algo del “klingon” del articulo y conocer las herramientas antes se visionen los artículos: https://elbinario.net/2017/03/20/destripando-aplicaciones-en-android-primera-parte https://elbinario.net/2017/04/03/destripando-aplicaciones-en-android-final […]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax