Cuando nos enfrentamos a un
proceso de reversing sobre una app Android una de las dificultades que podemos encontrar al hacer un
análisis estático
es un código complejo de trazar,
ya sea por intención propia del desarrollador al escribirlo, por el uso
de algún sistema de ofuscación, o incluso porque el propio proceso de
decompilación ha generado un código poco legible.
Para lograr encajar las piezas de estos puzzles difíciles de resolver
nos podemos apoyar en un análisis
dinámico para por ejemplo identificar
qué ocurre en las comunicaciones, qué cambios se producen en el sistema
de ficheros, qué eventos genera la app, a cuáles responde, etc. Pero
seguiremos teniendo un código muy oscuro que en algunos casos requerirá
de un gran esfuerzo para determinar por ejemplo si un fragmento de
código malicioso se llega a ejecutar.
Hace tiempo comentaba en un artículo cómo podíamos alterar en tiempo de
ejecución el código de una app
Android haciendo uso de la librería para
hooking
Cydia Substrate para por ejemplo
desactivar el certificate pinning en Android.
Vista la capacidad de la librería, ¿porque no utilizarla para reflejar
métodos y parámetros recibidos en una app que queramos analizar?, de
este modo podríamos construir un árbol con el flujo de ejecución de la
app según interactuamos con ella (o mientras ella misma hace sus
procesos en background), identificando qué métodos llamaron a qué otros
métodos además de reflejando qué valores fueron pasados como parámetros.
Con la idea clara de representar el flujo de ejecución y parámetros
recibidos, decidí dar un paso más y hacerlo todo más sencillo, ¿por qué
no hacer una herramienta que automatice al máximo el proceso?, podría
conectarse al dispositivo, listar las apps, enumerar todas las clases
que participan en una app seleccionada y permitir al analista
seleccionar cuáles quiere observar...
android-hooker
Para poder utilizar la herramienta necesitaremos el siguiente entorno:
- Un dispositivo Android (físico o VM) rooteado, con Cydia Substrate instalado
- En el equipo desde el que vamos a realizar el análisis, será
necesario tener Java (JRE para ejecutar o JDK si queremos modificar el
proyecto) y las SDK tools de Android (con las Build Tools y una versión
de la API de Android compatible con la instalada en el dispositivo)
La herramienta funciona del siguiente modo:
- Descargamos la app del repositorio de Github con el siguiente enlace (MD5: bbf563831e3d6be77c773c15f8a978e1 ) o clonamos el repositorio y lo compilamos con "mvn clean assembly:assembly" (nos generará el JAR a ejecutar en el directorio target)
- Iniciamos la aplicación con "java -jar android-hooker-1.0-jar-with-dependencies.jar".
La primera vez que iniciamos la app tendremos que configurar la ruta al
directorio donde tengamos el Android SDK, seleccionar la versión de las
build tools que queramos utilizar y la versión del SDK que se ajuste al
dispositivo que vamos a analizar:
- Lo siguiente que hacemos es introducir la IP del dispositivo a
analizar (o dejarlo vacío si nos vamos a conectar a un dispositivo
físico conectado en modo depuración) y seleccionamos la opción Connect, nos listará las apps instaladas en el dispositivo:
- Seleccionamos la app que queremos analizar y seguimos con el botón Extract classes from APK,
descargará la app del dispositivo y podremos seleccionar las clases que
queremos hookear. Ya casi hemos terminado, seleccionamos las clases que
nos interesen y le damos a Hook classes:
En este punto es donde sucede la magia, dentro de
android-hooker
hay incluida una app Android que será compilada e instalada en el
dispositivo. La app Android está preparada con un plugin Substrate
diseñado para recibir un listado de clases sobre los que aplicará
reflection para hookear todos sus métodos y crear así una traza dejando un rastro en el logcat que posteriormente
android-hooker utilizará para crear el árbol de ejecución.
- Cuando se compile e instale la app Android veremos la notificación de Substrate en el dispositivo:
- En este momento ya podemos seleccionar en android-hooker la opción Watch logcat
y reiniciar el dispositivo para que se aplique el plugin. En cuanto los
métodos hookeados sean llamados comenzaremos a verlos reflejados en
pantalla:
Dejo también un vídeo para que lo podáis ver en marcha:
https://www.youtube.com/watch?v=Q-iUU7z0jZo
Detalles finales
En cuanto al uso de la tool en sí, como toda herramienta "automatizada",
recomiendo hacer un uso controlado. Si decidís hookear clases a diestro
y siniestro, especialmente sobre clases muy básicas del framework de
Android, posiblemente dejéis colgado el dispositivo al generar una
actividad elevada sobre el logcat. Recordar, en la mesura está la
maestría ;) .
Y en cuanto al código:
- Si queréis hacer vuestros propios ajustes sobre la app Android encargada del hooking, el código relevante lo tenéis en la clase LoggerPlugin
- Si queréis modificar la app Android, tendréis que comprimir todo el
directorio de la app en un zip con nombre substrateApp y guardarlo en el
directorio de resources (podéis darle un vistazo al zip que hay ahora para haceros una idea). Con esto el siguiente empaquetado que hagáis con "mvn clean assembly:assembly" usará vuestra app modificada.
Artículo cortesía de Miguel Ángel García