26 sept 2011

Curso de introducción a Android V (Flu-AD)

Después de haber pasado un par de semanas conociendo el API para manejar Wifi que proporciona Android, vamos a cambiar de tercio proponiéndonos como reto la migración de Flu a plataformas móviles.

Como todos sabemos, el proyecto Flu es un desarrollo orientado al control remoto de máquinas a través de un troyano. Nuestro objetivo principal será mantener la arquitectura cliente - servidor original de Flu, únicamente variando y adaptando la parte del servidor a dispositivos móviles Android.

La finalidad de todo esto es lograr exportar el potencial de la idea de Flu a un escenario completamente nuevo que puede aportar cosas muy interesantes, tantas, que necesitaremos de vuestras propuestas y colaboración para poder exprimir la idea al máximo.

Para el desarrollo de este proyecto seguiremos tres fases fundamentales:

  • Fase troyano: En esta fase se desarrollará y se explicará cómo introducir en una aplicación Android código "malicioso". Lo que se pretende con esto es generar una capa oculta al usuario, de forma que al ejecutar una aplicación (aparentemente inofensiva) se instale un servicio permanente cuyo fin sea ejecutar órdenes obtenidas de un cliente web.
  • Fase de lectura de órdenes: En esta fase se mostrará cómo se parsea contenido xml en Android, en concreto se parseará el código xml que generemos con la herramienta Flu.
  • Fase de ejecución de órdenes: En esta última fase veremos y definiremos qué órdenes podremos ejecutar en el teléfono móvil.

Empezando por la fase troyano, hoy mostraremos cómo construir un servicio permanente en Android  que se ejecute siempre que el usuario encienda su dispositivo móvil.

Un servicio (clase Service) es un proceso asociado a una aplicación que se usa generalmente para hacer tareas con las que el usuario no tiene interacción. Para entenderlo mejor, un ejemplo de servicio que podemos ver en nuestro teléfono móvil Android es el servicio de la aplicación whatsapp cuya tarea principal es comprobar si tenemos mensajes en el servidor dirigidos a nosotros.

Ahora vamos a crearnos nosotros uno. Creamos un nuevo proyecto Android con una clase principal Main que hará las funciones de aplicación benévola y lanzará nuestro servicio. La actividad Main vamos a dejarla, en términos de diseño, tal y como se nos ofrece al crear el proyecto, salvo por un par de líneas extra que lanzarán el servicio. El código de la actividad Main tendrá este aspecto:

Como podemos observar, creamos una instancia de la clase Intent con la particularidad de que la clase Trojan simplemente se dedicará a interceptar eventos. El evento que nos interesa interceptar, en este caso, es el de inicio o arranque del sistema operativo del dispositivo móvil. Una vez que un sistema Android ha iniciado envía una acción broadcast llamada android.intent.action.BOOT_COMPLETED, nuestro objetivo es interceptar dicho evento. Para interceptar eventos, debemos crearnos una clase que herede de BroadcastReceiver, que será la encargada de interceptar los eventos que indiquemos en el fichero AndroidManifest.xml. La clase Trojan que intercepta eventos tendrá este aspecto:

Dentro de esta clase aprovecharemos para lanzar un servicio que se ejecute temporalmente. La forma de lanzar un servicio es muy parecida a la de lanzar una nueva actividad, simplemente creamos una nueva instancia de Intent con la clase destino Servicio, e iniciamos dicho servicio mediante el método startService propio de la clase Context. La clase Servicio será distinta a una actividad normal, en vez de heredar de Activity heredaremos de Service.

Al heredar de Service debemos reescribir algunos métodos, en este caso nos interesan los métodos onCreate y onStart. Al crearse, el servicio entrará en el método onCreate donde le diremos que cree un Timer, que será el encargado de gestionar que la tarea del servicio se haga de forma periódica. En el método onStart, crearemos la tarea periódica TimerTask y se la pasaremos a nuestro timer para que la ejecute cada 30 segundos. En cada ejecución sacaremos un log en el depurador, de forma que podamos observar que el servicio se está ejecutando tal y como deseamos.

Todavía falta nos falta el último paso, indicar al AndroidManifest.xml el servicio, el broadcast receiver,  el evento a interceptar y los permisos necesarios. Nuestro fichero AndroidManifest.xml quedaría de la siguiente forma:

Como podemos ver, tenemos declarados nuestra actividad Main, el receiver Trojan registrado al evento android.intent.action.BOOT_COMPLETED de inicio del sistema, el servicio y los permisos para registrarse al evento de inicio del sistema.

Si nos fijamos, nuestro servicio no aparece en las aplicaciones activas del teléfono, pero sí que podremos encontrarlo en servicios en ejecución. Más adelante intentaremos que esto no ocurra, cambiando de estrategia o camuflándolo de alguna manera. Esperemos que esto os sirva ya que este esquema puede ser aplicable a muchos más escenarios del que aquí proponemos.

Como siempre, os adjunto el código.Saludos!!---Descarga Proyecto

 

===============================================================

Curso de introducción a Android (Instalación del Android SDK + Hello World)

Curso de introducción a Android II (Creando nuestra primera aplicación)

Curso de introducción a Android III (Escáner de redes WIFI)

Curso de introducción a Android IV (Crackeando redes Wifi)

Curso de introducción a Android V (Flu-AD)

===============================================================

 

3 comentarios:

  1. me encantan estos cursos de introducción a android, espero poder aprovecharlos dentro de poco XD ya os mostraré los resultados

    ResponderEliminar
  2. [...] móvil en Android. El curso sigue teniendo mucho tirón y está más emocionante que nunca, el Flu-bot for Android va cogiendo [...]

    ResponderEliminar