Sí, habéis entendido correctamente: depurar
malware para Android con el IDE Eclipse. Normalmente Eclipse se usa para
desarrollar aplicaciones como Android, no para depurar aplicaciones compiladas.
Con el depurador/desensamblador IDA se puede ver el código Dalvik de una
aplicación Android, pero no se puede depurar una aplicación a ese nivel.
También existen herramientas para transformar las aplicaciones Android en jar,
con dex2jar por ejemplo y luego decompilarlos. Sin embargo, la decompilación
no se hace correctamente, especialmente con los bucles. Como a veces el
atacante ofusca su código, la ingeniería inversa es más difícil. Entonces, necesitamos de una herramienta para depurar la aplicación ofuscada.
En un foro ruso, hemos descubierto
una manera de depurar las aplicaciones Android desensamblando el código Dalvik.
Usaba la herramienta apktool para desensamblar las aplicaciones Android y el IDE Netbeans 6.8 para depurar. Esta técnica fue mejorada
y adaptada para la nueva versión de Eclipse. En esta entrada del blog, me gustaría
compartir ésta técnica, que consideramos merece la pena.
Como ejemplo, usaremos
una aplicación que hemos desarrollado llamada SilentSMS y que tiene el nombre
de paquete "com.example.silentsms".
Admitimos que el usuario tiene la configuración para desarrollar aplicaciones
Android con Eclipse, es decir el emulador Android, DDMS para depurar, etc.
El primer paso
consiste en desensamblar el APK en código Dalvik para modificar la aplicación y
hacerla depurable. Para ello, usamos la herramienta Apktool 2.0 beta. Después
del desensamblado, localizamos el archivo "AndroidManifest.xml" que nos permite saber cual es la primera parte
del programa interpretada y también nos permite hacer la aplicación depurable.
Para ello, añadimos la bandera android:debuggable a "true" a la etiqueta "application".
También, nos permite saber que la primera parte del código interpretado se
encuentra en la clase "com/example/silentsms/MainActivity".
Sin embargo, haciendo la aplicación depurable no permite a la aplicación esperar a un depurador. Es decir, al ejecutar la aplicación, no podríamos depurar al comienzo. Para forzar a que la aplicación espere al depurador, añadimos la instrucción "invoke-static {}, Landroid/os/Debug;->waitForDebugger()V". Es importante no olvidar el "a = 0;//" delante de ésta instrucción.
¿Por qué añadir un código delante? La razón es que cuando vamos a importar el proyecto desensamblado en Eclipse, no podríamos depurarlo por culpa de los errores de sintaxis generados por Eclipse. Es decir, Eclipse no sabe analizar sintácticamente el código Dalvik. Para evitar esto, comentamos el código Dalvik y ponemos una instrucción. En nuestro caso, incluimos la variable "a" puesta a 0 en cada línea. En otras palabras, Eclipse verá solo las instrucciones "a = 0", mientras que nosotros veremos el código Dalvik correspondiente a esta línea. De manera más macroscópica, la clase se asemeja a:
package com.example.silentsms; class MainActivity {void a() { int a;
a = 0; //
.
.
.
}}
En otras palabras,
el código Java es correcto y no genera ningún error.
El segundo paso consiste en
ensamblar de nuevo la aplicación y firmarla. Para firmar la aplicación,
necesitamos una llave. Usaremos la llave del Android SDK que se encuentra en la
carpeta ".android" de la carpeta home del usuario en Linux. Para ensamblar de
nuevo la aplicación usamos:
java -jar apktool _2.0.0b7.jar b -d out -o debug.apk
Mientras que para firmar la
aplicación empleamos:
jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore
debug.keystore debug.apk androiddebugkey
El tercer paso consiste en importar el proyecto desensamblado y depurarlo en Eclipse. Para eso, creamos un nuevo proyecto Java e importamos el proyecto desensamblado. Después ejecutamos la aplicación Android en el emulador. Cambiando la vista en DDMS, podemos ver la lista de procesos ejecutándose así como las listas de procesos esperando un depurador indicado por el icono rojo al lado. Para añadir esos procesos, podemos conectar un depurador en remoto sobre los puertos [8609-8700].
Para que Eclipse se conecte a nuestro proceso, necesitamos configurar el depurador. Para eso, accedemos a "Run->Debug Configurations", y luego pulsamos "Remote
Java Application". Configuramos el puerto para que el depurador se conecte
al proceso correcto. En nuestro caso, elegimos el puerto 8609.
Antes de pulsar el botón
"Debug", necesitamos poner
un "breakpoint" justo donde
queremos para el depurador. En nuestro caso, queremos pararlo justo cuando
llama a la función "onCreate".
Depurando el proceso, Eclipse nos propone cambiar de perspectiva.
Finalmente, podemos depurar
la aplicación (step over, step into, etc.) como si fuera una aplicación Android
desarrollada por nosotros.
Hemos visto como usar Eclipse
para depurar aplicaciones Android a nivel de código Dalvik, lo que incluso nos permite
hacer ingeniería inversa de las aplicaciones ofuscadas. Es decir: desensamblar
una aplicación Android, hacerla depurable, reensamblarla, importarla en Eclipse
y depurarla. Sin embargo, no podemos depurar las bibliotecas compiladas en
código nativo (por procesorses ARM, Intel por ejemplo). Para eso, necesitamos usar otro depurador como IDA.
Más información:
Отладка приложений
для Android без исходного кода на Java
http://habrahabr.ru/post/150825/,
Septiembre 2012
Programering, Marzo 2014
Aptkool 2.0, 2014
Eclipse, 2014
Laurent Delosières
apktool 2.0:
ResponderEliminarhttp://connortumbleson.com/apktool/test_versions/apktool_2.0.0b9.jar?ref=hispasec.com