miércoles, 25 de junio de 2014

Reversing sencillo en Android

Realizar ingeniería inversa en Java es relativamente sencillo. El código fuente se pre-compila en el pseudocódigo Java Bytecode preparado para ser interpretado por la máquina virtual de Java ó JVM.

El formato Apk (Aplication PacKage file) de Android es un contenedor, en un formato zip, para la instalación de aplicaciones. Contiene ficheros como el contenedor de ejecutables classes.dex, los recursos en la ubicación res, los recursos compilados en resources.arsc y el fichero AndroidManifest.xml.

Archivo apk abierto como un compresor zip.


Los ficheros xml contenidos en el apk se encuentran en formato XML binario y por lo tanto no serán legibles si se abren directamente. Por otra parte, el fichero classes.dex es el código compilado en formato Dex (Dalvik EXecutable) e interpretado por la máquina virtual Dalvik en Android.

Existen múltiples herramientas para realizar ingeniería inversa de los fichero .dex y hacer legibles los xml.

XML-Apk-parser es un parser escrito en Java que permite convertir los XML binarios a XML en formato texto.

android-apktool es una herramienta escrita en Java y de software libre que decodifica los recursos a su formato original. Incluye además capacidad de depuración de código con smali.

Para decodificar el contenido apk solo es necesario ejecutar desde un terminal la siguiente línea:

~$: java -jar apktool.jar decode file.apk path_destination

Ejemplo decodificando apk con apktool.
El resultado obtenido no siempre es igual al original. Por ejemplo, los identificadores de elementos de Layout no incluyen el símbolo "+".

El código compilado en classes.dex también se puede decodificar. dex2jar traduce un fichero en formato Dex a formato Jar (Java ARchive). Una obtenido el fichero Jar se puede decompilar el código con JD-GUI.

Otra opción también válida y mucho más cómoda es decompilar directamente el fichero Dex con Jadx.

Su instalación es bastante sencilla:

~$: sudo apt-get install git
~$: git clone https://github.com/skylot/jadx.git
~$: cd jadx
~$: ./gradlew dist


Se puede abrir un fichero dex directamente con la interfaz gráfica de Jadx:

~$: ./jadx/build/jadx/bin/jadx-gui classes.dex &

Desensamblando el código de classes.dex con Jadx-GUI.

Radare2 ó r2 es un conjunto de herramientas y scripts en línea de comandos para realizar desensamblado con soporte para múltiples arquitecturas como el Motorola 68000, Mips, i386, x86-64, dalvik entre otros y soporte de varios formatos de ficheros como el dex.

En el blog de Sebastián Guerrero hay un artículo muy interesante sobre el uso de r2 con aplicaciones Android.

Recordad que el objetivo de esta entrada no es fomentar la piratería de aplicaciones ni tirar abajo el duro trabajo de los desarrolladores.

Para evitar que nuestras aplicaciones puedan ser interpretadas fácilmente hay herramientas como ProGuard que permiten ofuscar el código fuente.

No hay comentarios:

Publicar un comentario