Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Captura de paquetes de red en Android?

Estoy trabajando en un proyecto donde necesito capturar los paquetes entrantes / salientes y almacenarlos en un archivo de pcap.

Android ha proporcionado VpnService para este propósito que se agregó en el nivel 14 de la API. Aunque parece que hay un montón de preguntas sobre esto en SO, sorprendentemente hay muy menos ejemplos de trabajo de la misma. Intenté usar ToyVpn que se añade en las muestras pero no pude hacer que funcione. Entonces me encontré con este ejemplo.

Ejemplo de VpnService

El ejemplo resume la captura en los siguientes pasos.

  1. Crear una interfaz TUN (todavía no estoy seguro de lo que es TUN, pero el surf en Internet dice que es la emulación de la capa de red en el dispositivo).
  2. Obtenga el archivo Descriptor para paquetes entrantes y paquetes salientes a través del TUN.
  3. Envía estos paquetes al servidor real. (No está seguro de qué servidor es aquí?) Cada paquete saliente tiene un requestUrl , así que el servidor aquí significa delegar la petición al servidor requestUrl . ¿O significa servidor que crea su propio servidor en algún lugar de AWS y redirige todo el tráfico allí que a su vez Redirigir el tráfico hacia el destino real).
  4. Obtenga la respuesta del servidor.
  5. Con la ayuda de TUN, pase esta respuesta de nuevo al componente previsto de la aplicación.

Creé un TUN usando el código a continuación. Le di la dirección que se dio en el tutorial mencionado anteriormente. No estoy seguro, si hay los valores correctos. Y cómo decidir esta dirección.

  Builder builder = new Builder(); ParcelFileDescriptor mInterface = builder.setSession("MyVPNService") .addAddress("192.168.0.1", 24) .addDnsServer("8.8.8.8") .addRoute("0.0.0.0", 0).establish(); 

A continuación, tengo el descriptor de archivo, y abrió el túnel.

  FileInputStream in = new FileInputStream( mInterface.getFileDescriptor()); DatagramChannel tunnel = DatagramChannel.open(); // I have created a EC2 instance on AWS, and gave the ip Address and port of that server. Not sure if this is the correct method. tunnel.connect(new InetSocketAddress("54.254.187.207", 5000)); //d. Protect this socket, so package send by it will not be feedback to the vpn service. protect(tunnel.socket()); 

A continuación, se aplicó un bucle while para leer los paquetes.

  while (true) { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); while(true){ String line = reader.readLine(); if(line ==null){ break; }else{ System.out.println("line is "+line); } // I am guessing that here after reading the packets, I need to forward them to the actual server. }} 

Que me estaba dando la siguiente salida

 02-21 19:12:26.074 16435-16778/awesomedroidapps.com.debugger I/System.out: line is E    @ '@  @      <  5  ,                    graphfacebookcom      E    @ (@   02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is E    @0@  @    d : N    P V x %0/ W      02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   EP    02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is  %0. %0/E    L @  @     Ɂ  5  8 [                 apploadingestcrittercismcom      E    @ :@  @     d6    > Wz  y A x [     02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   T@  02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is y 1 y 7E    A @  @        5  -  -                 decidemixpanelcom      E      ;@  @ F   d6    > Wz y A x       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   ]@   F    BA  +  q ϔ   Jb2_' D y ̯  [: 1)   PΠ ѡ   h71 L 3 =~      (                 S ~'U      9d_   " I E    @0@  @  02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is    d : N    P V x %0/ W       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is   ^P    02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is  %0. %0/E    = @  @         5  )l                t appsflyercom      E    = @  @      6  5  ) .                t appsflyercom      E    @0@  @    d : N    P V x %0/ W       02-21 18:43:53.648 16435-16639/awesomedroidapps.com.debugger I/System.out: line is    P    

De los registros es claro que soy capaz de capturar los paquetes salientes en el TUN. Los registros anteriores en algún lugar de impresión de hosts como facebook.com que me hace creer que estoy en el camino correcto.

Pero, ¿qué debo hacer después de esto? ¿Cómo reenviar datos al servidor? Creo que hay menos ejemplos de trabajo. ¿Pero alguien puede darme procedimiento paso a paso sobre cómo lograr esto?

Actualización : Después de excavar más, llegué a saber que tengo que crear un servidor y reenviar los paquetes interceptados al servidor. Creé un servidor en mi computadora y podía enviar con éxito paquetes interceptados a mi servidor. Pero no estoy seguro cómo conseguir el IP y el puerto verdaderos del destino del paquete recibido de modo que pueda enviarlos al destino previsto.

PS : También pasé por la biblioteca JnetPcap , pero parece que para capturar los paquetes en vivo, el teléfono necesita ser arraigado que no es el requisito de mi aplicación.

  • ¿Cómo configurar VPN de forma programática?
  • Cómo conectarse a una VPN, que ya está configurada en un teléfono Android, mediante programación
  • Obtener el estado de la conexión VPN en Android
  • Desvío de paquetes VPN
  • Conectar a VPN en Genymotion Android
  • Proteger un socket en VpnService
  • Cómo comprobar el estado de la conexión VPN en Android ICS
  • ¿Cómo encontrar el estado de la conexión VPN a través de API de marco o cualquier otro método eficiente?
  • One Solution collect form web for “Captura de paquetes de red en Android?”

    Bastante seguro de su mejor opción es configurar un servidor proxy y luego usar algo como wireshark para controlar el tráfico que va y viene. No soy un experto en esto, pero en los viejos días antes de que los enrutadores de la conmutación fueran tan baratos, era muy fácil porque todos los paquetes fueron transmitidos a todas las computadoras en la misma subred. Tal vez si pudiera poner sus manos en un hub / router que tiene la capacidad de deshabilitar el cambio que podría utilizar este método en lugar de un proxy.

    En estos días la mayoría de las comunicaciones se hace usando http y para que tenga excelentes herramientas como Charles (mac) y Fiddler (windows) que hacen exactamente lo que desea, excepto http. Pueden al menos ser capaces de darle ideas sobre cómo hacer lo mismo con Wireshark

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.