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)
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
Hasta el desensamblado y ensamblado y más allá. Ya no hay excusa para desenmascarar maliciosos desarrolladores +111110100
0
Buenas tardes, no encuentro el archivo odex de la aplicacion que quiero modificar pero tengo el apk de la aplicación, puedo hacer algo con ella?
Solo quiero modificar la fecha de expiración de una aplicación, es todo lo que quiero modificar, me puedes ayudar por favor? tengo el apk