Analizando malware en Android: de bytecode a Java

En nuestro post anterior donde describimos los primeros pasos del análisis de malware en Android vimos como obtener información del malware y de que manera acceder a sus recursos a través del uso de apktool. De esta manera ya conocemos los permisos analizando el AndroidManifest.xml, y la estructura principal de la aplicación. Ahora llego el momento de encontrar que es lo que hace, en otras palabras, cuál es su objetivo. Ahora amos a ver de qué otra manera se puede analizar el código sin la necesidad de comprender el bytecode de Dalvik.

La salida que genera la herramienta que utilizamos en relación al archivo classes.dex esta compuesta por distintos archivos con extensión .smali, ya vimos cual era su contenido pero no dijimos nada acerca de su interpretación. Para aquellos interesados pueden bytecode de máquina virtual de Dalvik y así poder entender en detalle el código de la aplicación, sin la necesidad de utilizar otras herramientas, o buscar la manera de obtener este mismo código pero en un lenguaje un poco más conocido: Java.

Entre las herramientas disponibles para esta tarea, se puede utilizar dex2jar, que toma un archivo APK o el classes.dex y devuelve un archivo .jar, que se puede abrir con decompiladores de Java como JD-GUI y acceder al código de la aplicación en Java. El principal objetivo de realizar este tipo de operaciones es para acelerar el análisis de la amenaza, o evitar pasar grandes cantidades de tiempo comprendiendo la estructura de la aplicación.  Las aplicaciones de Android, se desarrollan principalmente en Java, y como se trabaja sobre una maquina virtual es posible obtener una salida con un alto nivel de similitud al código original:

Las aplicaciones de Android, tienen cuatro elementos muy importantes a tener en cuenta, estos son las activity, services, receivers e intents. Como vimos anteriormente, cuando se recibe un mensaje de texto, este código malicioso lo que hace es llamar internamente al receiver SecurityReceiver. Para poder ver el código que se ejecuta lo que podemos hacer es utilizar dex2jar y luego de abrir el archivo de salida con un decompilador de Java buscar la clase SecurityReceiver e ir a su punto de inicio: onReceive():

Como pueden ver en la imagen anterior la diferencia entre la facilidad para leer un tipo de código u otra es notable, sin embargo, hay momentos en que puede resultar necesario leer directamente el bytecode. Sin embargo, la información que se obtiene luego de decompilar el archivo APK y llegar nuevamente al código en Java hace que sea más sencillo entender las funcionalidades o actividades que realiza el código malicioso.

En este punto podemos recapitular cuales son los pasos para analizar un código malicioso para Android de manera estática. Primero hay que tomar el archivo y acceder al AndroidManifest.xml, así podemos conocer los permisos que necesita la aplicación  los recursos que utiliza y que actividades principales tiene. Luego, una vez que se identificaron los puntos más importantes buscamos acceder al código de la aplicación  ya sea al bytecode o al código decompilado en Java y entender su funcionamiento. Si bien la descripción de lo que hay que hacer parece simple, el análisis de las amenazas para Android pueden requerir de una gran cantidad de tiempo. Ademas, este tipo de análisis de una aplicación no nos permite conocer su comportamiento ni ver de que manera interactúa con el usuario.

En la próxima entrega vamos a ver como hacer para analizar diatónicamente un código malicioso en Android, primero de manera manual y luego utilizando herramientas que nos permitan recopilar información de la amenaza de manera automática, para finalmente aprender ver cómo utilizar herramientas de desarrollo para el análisis de malware en la  plataforma móvil de Google.

Pablo Ramos
Security Researcher

Autor , ESET

Síguenos