En esta cuarta entrada del curso de introducción a Android, veremos como podemos aprovechar el Ejercicio2, que implementamos en la entrada anterior, para realizar un pequeño crackeador de redes Wifi del estilo WLAN_XXXX o JAZZTEL_XXXX cuya seguridad sea WPA. La aplicación resultante deberá tener la siguiente apariencia.
La aplicación resultante hará un escáner de las redes Wifi que tengamos a nuestro alrededor y nos mostrará en una lista las redes encontradas con una pequeña descripción de cada una. Cuando seleccionemos una red de la lista podremos observar una descripción más detallada de ella, pudiendo obtener también su clave si la red es del estilo WLAN_XXXX o JAZZTEL_XXXX.
Vamos entonces a crearnos un nuevo proyecto cuyo nombre sea FluWifiCracker, como paquete com.fluproject.FluWifiCracker, su target Android 2.2 y como clase principal Main (si alguien no recuerda como se hace todo este proceso que le eche un vistazo a las dos primeras entradas).
Diseñando la interfaz de la actividad Main:
Nuestra primera actividad Main será idéntica a la propuesta en el Ejercicio2 de la entrada anterior. Recordamos que esta actividad consta de un ImageView que se corresponde con el banner de Flu Project y de un Button con imagen de fondo. Podemos entonces copiarnos el mismo fichero main.xml que utilizamos en el Ejercicio2 a nuestra carpeta /res/layout y sustituirlo por el existente. Tampoco se nos debe olvidar hacer lo propio con los recursos de la imagen del banner y la imagen del botón.
Definiendo la funcionalidad de la actividad Main:
La funcionalidad de esta actividad también será exactamente igual a la propuesta en el Ejercicio2. Simplemente necesitamos capturar el evento del botón de escáner implementando la interfaz OnClickListener y reescribiendo el método OnClick. Cuando entremos en el método activaremos nuestro módulo Wifi para realizar el escáner de redes y pasaremos a una nueva actividad donde se muestra una lista con todas las redes encontradas.
Diseñando la interfaz de la actividad Wifilist:
El diseño de esta actividad cambia un poco con respecto al anterior ejercicio. En este caso hemos querido dar más información de cada red y añadirle además una imagen que nos indique la potencia de señal recibida de cada una. El fichero elements.xml que define cada item de la lista tendría el siguiente aspecto:
En vez de utilizar un LinearLayout como contenedor de objetos, hacemos uso ahora del contenedor TableLayout que alinea vistas en forma de tabla. Nuestro TableLayout estará compuesto de filas llamadas TableRow. Cada TableRow tendrá dos objetos, la primera y la segunda fila tendrán dos TextView consecutivos y la última fila tendrá un TextView y un ImageView.
Definiendo la funcionalidad de la actividad Wifilist:
La funcionalidad de esta actividad es prácticamente igual que la del Ejercicio2 salvo dos aspectos nuevos: El manejador de eventos de la lista y la transferencia de información entre actividades.
Para manejar eventos de la lista tenemos que implementar la interfaz OnItemClickListener (1) y poner la instancia de ListView a escuchar mediante el método setOnItemClickListener (2). Al implementar la interfaz OnItemClickListener tendremos que rescribir el método onItemClick.
Al cargar el aspecto de cada item de la lista, en el método getView, se ha introducido un icono que indica la potencia de señal recibida por cada red descubierta. Hemos introducido una comparación del valor numérico de la señal y hemos asociado un icono de cobertura para distintos rangos (3).
Volviendo a la captura de eventos de la lista, al implementar de OnItemClickListener rescribimos el método onItemClick (4). Cuando rescribimos el método observamos que disponemos de un argumento position. Dicho argumento nos servirá para indexar en nuestro array de redes y sacar toda su información para posteriormente enviársela a una nueva actividad.
Vamos a definirnos una nueva clase llamada WifiInfo.java. Para pasar elementos a la actividad que representa dicha clase nos vamos a apoyar en el método putExtra que nos ofrece la clase Intent. Dicho método envía un objeto representado por un tag textual para que luego pueda ser recogido en la clase destino. Haremos tantos putExtra como información queramos enviar a la actividad WifiInfo que se encargará de mostrar toda la información detallada de la red elegida (y si puede la clave :P)
Diseñando la interfaz de la actividad WifiInfo:
Esta actividad tendrá un diseño muy sencillo donde volveremos a apoyarnos en un TableLayout como contenedor de objetos con el fin de alinearlos de forma ordenada. A continuación mostramos el fichero wifiinfo.xml que define el diseño de la actividad.
Definiendo la funcionalidad de la actividad WifiInfo:
Esta actividad tendrá como cometido recoger los valores que le envía su actividad padre, representarlos y, si la red es crackeable, mostrarnos su clave.
A continuación se muestra el código de la clase WifiInfo.java y se explican las partes más importantes del mismo.
Para recoger la información procedente de la actividad WifiList se obtienen los extras de la presente actividad. Para ello hacemos uso del método getExtras. Si hemos obtenido información tenemos que parsearla usando los mismos tags que utilizamos para enviarla (1).
Una vez que tenemos toda la información parseada y guardada en objetos en memoria la mostramos por pantalla indicándosela a los objetos que definimos en la fase de diseño de esta actividad.
Comprobamos después si la red es crackeable, para ello comprobamos si la red es del tipo WLAN_XXXX o JAZZTEL_XXXX. Si es así, creamos una instancia a la clase KeyGenerator (por cortesía de dolphinziyo) y llamamos a su método calcularClave pasándole los cuatro últimos dígitos del ESSID y el BSSID en mayúsculas. Este método sustituye las cuatro últimas letras del BSSID por las cuatro últimas letras del ESSID, posteriormente se le añade a la cadena el BSSID original. Finalmente, al principio de la cadena añade la palabra "bcgbghgg", calcula la suma MD5 de la cadena entera y se queda con los 20 primeros dígitos que corresponden a la clave de la red (ver entrada http://www.flu-project.com/crackear-wpa-rotura-de-wlan_xxxx.html).
Espero que os haya gustado :D
Saludos!!
===============================================================
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)
===============================================================