Decompilar una aplicación de Android

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.dex
classes.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 2

sget-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: , , ,

Archivado en:Android

4 comentarios en “Decompilar una aplicación de Android”