Las aplicaciones en Android se programan en Java y es un hecho conocido que Java se puede decompilar con relativa sencillez. Existen varios programas con interfaz gráfica, distintos nombres, distintas utilidades pero al final todos usan uno internamente AFAIK para funcionar: jad.
Debido a esto es fácil caer en el error como a mi me ocurrió de pensar en que los programas de Android se van a poder decompilar y modificar fácilmente. Esto en la realidad no ocurre así ya que el código binario generado para Android es para su ejecución en la DalvikVM que no tiene nada que ver con el bytecode de Java.
Cuando descomprimes un apk (porque también es bien sabido que no es más que un zip renombrado con unas características especiales), se puede encontrar un fichero classes.dex que contiene las clases de java usadas por la aplicación, entre otras cosas:
$ file classes.dexclasses.dex: Dalvik dex file version 035
Este fichero se puede deconstruir por ejemplo con las utilidades del proyecto smali, lo cual generará una serie de ficheros .smali con los opcodes de Dalvik. Estos ficheros .smali tienen el siguiente aspecto:
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 2sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, «Hello World!»
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
Así el fichero se puede en principio modificar con mayor o menor dificultad y volver a compilar con smali.
Pero no todo es tan bonito como parece hasta aquí, porque ahora hay que reconstruir el apk de la aplicación. El primer paso será actualizar el classes.dex dentro del apk. Esto se puede hacer con la misma utilidad zip estándar. Después hay que firmar el archivo con algo como:
$ jarsigner -verbose -keystore my_keystore com.nauj27.android.hackme.apk android
El problema viene cuando se intenta verificar la firma del paquete, obteniendo el siguiente mensaje:
$ jarsigner -verify com.nauj27.android.hackme.apk
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex
Cada fichero lleva una firma SHA1 que AFAIK no es posible saltarse. Probablemente se podrá hacer algo más pero por ahora lo voy a dejar aquí.
Etiquetas: android, dalvik, jad, java
4 comentarios en “Decompilar una aplicación de Android”
agosto 22nd, 2010 en 01:05
¿Eso cierra las puertas a craquear algún que otro apk?
agosto 24th, 2010 en 16:19
No creo, habrá otras formas, o incluso se podrá generar un paquete nuevo en lugar de intentar actualizar el que tengas.
También es interesante leer sobre las ROMs deodexed ;)
septiembre 9th, 2011 en 06:04
que tal apkTool, te permite muchas cosas mientras te mueves por el codigo libremente, el problema siempre radicara al volver y hacerle build al codigo o sea re-compilar pero traten ;-)
enero 4th, 2012 en 11:58
En http://guiandroid.com/como-descompilar-aplicaciones-android/ recomiendan un programa que al parecer sirve mejor para esta labor (aun no lo he probado).