1. Code
  2. Mobile Development
  3. Android Development

Analizando el tráfico de la red en Android

Scroll to top

Spanish (Español) translation by steven (you can also view the original English article)

El análisis del tráfico de la red puede ser una parte vital del proceso de prueba y depuración del software. ¡Este tutorial te enseñará cómo monitorear todo el tráfico entrante y saliente en un dispositivo Android para depurar mejor tus aplicaciones!

Como desarrollador, a menudo uno tiene que crear software que realice solicitudes HTTP, envíe mensajes u obtenga información de solicitudes entrantes o salientes a través de la red. Cuando estas transacciones de red funcionan desde el principio, todo está bien; estamos recibiendo exactamente lo que se espera y lo que estamos enviando tiene el formato adecuado y los valores correctos.

Sin embargo, esto con frecuencia no sucede, y es necesario comprender exactamente qué se envía y se recibe a través de la red para determinar qué salió mal. Quién sabe, ¡tal vez la solicitud ni siquiera se esté haciendo y no nos demos cuenta! Ésta es una circunstancia en la que saber capturar y analizar el tráfico de la red se vuelve crucial.

La captura del tráfico de la red para un análisis posterior es buena, pero es aún mejor si podemos realizar este análisis al mismo tiempo que se realiza la captura. Al hacerlo, se puede saber qué solicitud o respuesta corresponde a cada caso de uso, lo que facilita mucho el análisis. En los siguientes pasos, te mostraré cómo capturar el tráfico en tiempo real desde un dispositivo Android y canalizarlo a un analizador de red como Wireshark.


Paso 1: Instalando tcpdump

El primer paso es instalar tcpdump en el dispositivo. tcpdump es una utilidad de línea de comandos que captura el tráfico en un dispositivo de red en particular y lo descarga en el sistema de archivos. tcpdump se puede descargar desde aquí.

Una vez que se ha descargado el binario tcpdump, todo lo que tenemos que hacer es usar adb para insertar el archivo en el dispositivo. Para poder hacerlo, tu teléfono debe estar conectado y correctamente identificado por tu computadora.

Lo primero es lo primero, es importante que actualices tu ruta agregando el directorio de herramientas de la plataforma del SDK de Android si aún no lo has hecho. En caso de que nunca lo hayas hecho, hay instrucciones claras sobre cómo hacerlo en la página de desarrolladores de Android. ¿Listo? Abre una terminal y escribe lo siguiente:

1
adb devices

El dispositivo conectado debería aparecer en una lista. Si este no es el caso, asegúrate de que esté conectado correctamente y de que tienes todos los controladores necesarios para ese teléfono específico.

¿Ves el dispositivo en la lista? ¡Excelente! Ahora estamos listos para insertar el archivo tcpdump en él:

1
adb push /home/tcpdump /data/local

Para realizar los siguientes pasos, necesitamos obtener privilegios de root en el dispositivo y asegurarnos de que tcpdump sea ejecutable:

1
adb shell
2
cd data/local
3
su
4
chmod 777 tcpdump

Paso 2: Guardar el volcado de tráfico en un archivo

Tcpdump ahora se puede iniciar desde el mismo adb shell y la salida se puede guardar en un archivo:

1
./tcpdump -s 0 -v -w out.pcap

La lista completa de opciones de tcpdump se puede encontrar en la página del manual de tcpdump.

Una vez que se completa el volcado, podemos dejar de capturar los datos. Para hacerlo, simplemente debes presionar Ctrl+C. El archivo resultante se puede extraer del dispositivo y guardar localmente, de modo que pueda analizarse con Wireshark.

1
adb pull /data/local/out.pcap /home/out.pcap

Pero esto no es exactamente lo que queríamos, ¿verdad? ¡Lo que queremos es poder canalizarlo a Wireshark en tiempo real! Relájate, estamos llegando.


Paso 3: Canalizar el tráfico de red a un puerto

El proceso de captura de los paquetes de red es básicamente el mismo en este caso. Sin embargo, en lugar de escribir los datagramas en un archivo, queremos escribirlos en la salida estándar, de modo que luego podamos redirigirlos usando netcat a un puerto específico en el teléfono.

Para hacerlo, el comando tcpdump debe cambiar ligeramente:

1
adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"

El tráfico ahora se redirige al puerto 12345 del teléfono.


Paso 4: Instalación de Netcat

Antes de continuar, asegurémonos de tener instalado netcat, ya que lo vamos a necesitar. Escribe nc en una nueva consola, presiona enter y observa lo que sucede. ¿Recibes el mensaje estándar que explica cómo usar el comando? Genial, estás listo. ¡Omite el resto de esta sección y continúa!

¿Sigues leyendo? Bueno, supongo que eso significa que, después de todo, no tienes netcat instalado. Que no cunda el pánico, puedes descargarlo desde aquí para Windows.


Paso 5: Canalización del tráfico a Wireshark

¿Recuerdas lo que mencionamos anteriormente con respecto a la actualización de la ruta para que adb esté disponible? También deseas hacer eso con netcat y Wireshark.

Una vez hecho esto, podemos usar la opción de reenvío de adb, que reenviará los paquetes desde el puerto tcp 12345 en el dispositivo al puerto tcp 54321 en la PC. De nuevo usaremos netcat para capturar los paquetes entrantes que ingresan por el puerto 54321 y canalizarlos a Wireshark.

Esto se hace en el siguiente comando, escrito en una nueva consola:

1
adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -

Ten en cuenta que el número del puerto elegido es irrelevante. La única razón por la que se han elegido diferentes números es para mostrar cómo los diferentes comandos se conectan entre sí. Se podría haber usado el mismo número de puerto para ambos comandos (o números diferentes de los anteriores, ¡siempre y cuando no se estén usando los puertos!) Y entonces funcionarían igual.

Debes asegurarte de que Wireshark se ejecute con los permisos correctos. De lo contrario, incluso cuando se abra Wireshark, aparecerá una ventana emergente informándote de una excepción.


Paso 6: Hacer la vida más fácil

Una vez configuradas las diferentes utilidades, el proceso de capturar el tráfico de la red y canalizarlo a Wireshark se realiza mediante dos comandos, que se ejecutan simultáneamente en dos terminales diferentes:

1
adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"
2
adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -

Ahora bien, este proceso sigue siendo bastante manual. Uno tiene que abrir manualmente dos terminales y escribir todas esas instrucciones, asegurándose de que no quede nada para que esto funcione. Esto es una molestia. Bueno, ese problema se resuelve fácilmente poniendo estas instrucciones en un script, para que haga todo el trabajo por nosotros.

Los usuarios de Windows pueden automatizar el proceso usando el script en el archivo de descarga adjunto a esta publicación.

1
start adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"
2
adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -

Notas para usuarios de Mac

Si has estado siguiendo este tutorial en una Mac, probablemente te estés rascando la cabeza, pensando por qué el proceso anterior realmente no parece funcionar para ti. Hay un par de razones por las que este podría ser el caso. Intentemos arreglar eso.

En primer lugar, asegúrate de estar utilizando la ruta correcta de Wireshark. Esto puede parecer trivial, pero no lo es. No deseas utilizar la ruta a la aplicación, sino la ruta completa al ejecutable de Wireshark real (por ejemplo, "/Applications/Wireshark.app/Contents/Resources/bin/wireshark").

¿Solucionado? ¡Bueno! Solo quedan un par de cosas más. Al invocar Wireshark a través de la línea de comando, usamos un signo menos al final. Esto representa la entrada estándar y en Windows funcionará bien. Sin embargo, esto no funcionará en Mac. Afortunadamente, esto se puede sustituir por el nombre de un conducto. Deseas especificar 2 (correspondiente a lo0) como el conducto a utilizar. Además, es posible que debas otorgar permisos de superusuario para poder ejecutar Wireshark. Este es el comando resultante que deseas utilizar:

1
adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2

Este es el script de Perl que funcionará para los usuarios de Mac (también se adjunta como descarga a esta publicación):

1
#!/usr/bin/perl
2
3
# Perform adb command on shell
4
# to check if the device is attached
5
$netstat = `adb shell 'netstat' 2>&1`;
6
if($netstat =~ m/error: device not found/)
7
{
8
die("Plug in your phone!\n");
9
}
10
11
# Gain root priviledges
12
open(SUDO, "|sudo echo ''");
13
close(SUDO);
14
15
# Redirect STDERR output to STDOUT
16
open STDERR, '>&STDOUT';
17
18
# Perform tcpdump and nc in background
19
open(COMMAND1, "(adb shell \"data/local/tcpdump -n -s 0 -w - | nc -l -p 12345\") |");
20
21
# Perform piping to wireshark
22
open(COMMAND2, "((adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | sudo wireshark -k -S -i 2) &) 2>&1 > /dev/null |");
23
24
# Make sure the exit message appears after wireshark has been launched (hacky)
25
sleep(5);
26
print("Press ctrl-c to exit...");
27
<STDIN>;