#Resumen AndroidNetMonitor es un sistema para monitoreo, recopilación y análisis pasivo de mediciones de paquetes a gran escala y detalladas desde dispositivos Android. Se utiliza para obtener información de aplicaciones reales de fuentes de tráfico y recopilar información breve de paquetes enviados y recibidos por teléfonos móviles. (es decir, IP de origen, puerto de origen, IP de destino, puerto de destino y protocolo de capa de transporte) y registra a qué aplicación móvil corresponde cada mensaje según el socket. Estos datos se almacenan en archivos en la tarjeta SD del teléfono móvil.
La información que debe registrarse en cada línea del archivo incluye: información de 5 tuplas de cada socket de red (es decir, IP de origen, puerto de origen, IP de destino, puerto de destino y protocolo de capa de transporte), tiempo de grabación, nombre de la aplicación y correspondiente. Eventos (crear/destruir sockets, etc.).
#Tecnología 1. Recompilar tcpdump y lsof en binarios adecuados para Android (arm-linux-androideabi-g++)
2. Utilice el Adaptador para vincular Listview, CheckBox y List<Programa (clase personalizada)>
3. Ejecute simultáneamente para capturar Socket y Packet, use el comando lsof +c 0 -i -F ctPnf 2>&1
y tcpdump -v -s -w pcap
4. Lea y analice los archivos /proc/net/tcp, tcp6,udp,udp6
y utilice el inodo del socket y el pid de la aplicación para establecer la adquisición y la correspondencia entre la cinco tupla y el nombre de la aplicación.
#Implementación (1) Para obtener la lista de aplicaciones, use PackageManager para recuperar todas las aplicaciones y datos, luego use ActivityManager y PackagesInfo para obtener todos los nombres de aplicaciones y pids obtenidos anteriormente, y muéstrelos usando el diseño de vista de lista.
(2) Para leer y analizar el archivo /proc/pid/fd en Android, use runTime.exec(cmd); puede ejecutar el comando cmd en Android, por lo que puede usarlo para obtener el resultado después de ejecutar el comando. Debido a que la lectura y el análisis del directorio /proc requieren permisos de root, runTime.exec("su"); Luego use ls -l /proc/(pid)/fd > /sdcard/fdres
para guardar la información en el archivo fdres y luego use cat /sdcard/fdres para extraer la información. Esto es un compromiso. En la información obtenida, utilice la expresión regular "socket:\S(\d+)\S"
para extraer todas las etiquetas de inodo del socket y colocarlas en ArrayList.
(3) Lectura y análisis de archivos /proc/net/tcp, tcp6, udp, udp6 (o use lsof +c 0 -i -F ctPnf 2>&1
) Lectura abstracta de tcp, tcp6, udp, udp6 como PollData Clase, use la clase Scanner que viene con Java para analizar y leer /proc/net/tcp, etc. El resultado obtenido es el siguiente
* sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid ...
* 0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 ...
* 1: 00000000:15B3 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 ...
* 2: 0F02000A:15B3 0202000A:CE8A 01 00000000:00000000 00:00000000 00000000 0 ...
*
Luego use el socket_inode obtenido anteriormente para encontrar la información específica correspondiente en la información obtenida. La información de socket específica obtenida al convertirla a decimal es la siguiente:
1.
2. 46: 010310AC:9C4C 030310AC:1770 01
3. | | | | | |--> connection state
4. | | | | |------> remote TCP port number
5. | | | |-------------> remote IPv4 address
6. | | |--------------------> local TCP port number
7. | |---------------------------> local IPv4 address
8. |----------------------------------> number of entry
9. 00000150:00000000 01:00000019 00000000
10. | | | | |--> number of unrecovered RTO timeouts
11. | | | |----------> number of jiffies until timer expires
12. | | |----------------> timer_active (see below)
13. | |----------------------> receive-queue
14. |-------------------------------> transmit-queue
15. 1000 0 54165785 4 cd1e6040 25 4 27 3 -1
16. | | | | | | | | | |--> slow start size threshold,
17. | | | | | | | | | or -1 if the threshold
18. | | | | | | | | | is >= 0xFFFF
19. | | | | | | | | |----> sending congestion window
20. | | | | | | | |-------> (ack.quick<<1)|ack.pingpong
21. | | | | | | |---------> Predicted tick of soft clock
22. | | | | | | (delayed ACK control data)
23. | | | | | |------------> retransmit timeout
24. | | | | |------------------> location of socket in memory
25. | | | |-----------------------> socket reference count
26. | | |-----------------------------> inode
27. | |----------------------------------> unanswered 0-window probes
28. |---------------------------------------------> uid
(4) Establecer la adquisición y la relación correspondiente entre el quíntuple y el nombre de la aplicación. El inodo de socket compartido por (2) y (3) y el pid de la aplicación se utilizan para establecer la adquisición y la correspondencia entre el quíntuple y el nombre de la aplicación. La información obtenida se guarda en el directorio predeterminado /sdcard/Android/data/com.xx en el formato de.
"The application name is, pid is, and socket is:"
"number_of_entry "+fields[i+0] + "n";
"local_IPv4_address "+fields[i+1] + "n";
"local_IPv4_address "+hexconvert.hexa2decIpAndPort(fields[i+1]) + "n";
"remote_IPv4_address "+fields[i+2] + "n";
"remote_IPv4_address "+hexconvert.hexa2decIpAndPort(fields[i+2]) + "n";
"connection_state" + fields[i+3] + "n";
"transmit_receive_queue"+ fields[i+4]+ "n";
"timer_active"+fields[i+5]+ "n";
"number_of_unrecovered_RTO_timeouts:"+fields[i+6]+ "n";
"uid: "+fields[i+7]+ "n";
"unanswered_0-window_probes: "+fields[i+8]+ "n";
"inode : "+fields[i+9]+ "n";
"socket_reference_count: "+fields[i+10]+ "n";
"location_of_socket_in_memory: "+fields[i+11]+ "n";
"retransmit_timeout: "+fields[i+12]+ "n";
"predicted_tick_of_soft_clock: "+ fields[i+13]+ "n";
"ack"+ fields[i+14]+ "n";
"sending_congestion_window: "+ fields[i+15]+ "n";
"slowstart: "+ fields[i+16]+ "nn";
(5) Cargar en el servidor y analizar usando el script GT ProgramPython