#Summary AndroidNetMonitor é um sistema para monitoramento passivo, coleta e análise de medições de pacotes refinadas e em grande escala de dispositivos Android. Ele é usado para obter informações reais de aplicativos de fontes de tráfego e coletar informações breves de pacotes enviados e recebidos por telefones celulares. (ou seja, IP de origem, porta de origem, IP de destino, porta de destino e protocolo da camada de transporte) e registre a qual aplicativo móvel cada mensagem corresponde de acordo com o soquete. Esses dados são armazenados em arquivos no cartão SD do telefone móvel.
As informações que precisam ser registradas em cada linha do arquivo incluem: informações de 5 tuplas de cada soquete de rede (ou seja, IP de origem, porta de origem, IP de destino, porta de destino e protocolo da camada de transporte), tempo de gravação, nome do aplicativo e correspondente Eventos (criar/destruir soquetes, etc.).
#Tecnologia 1. Recompile tcpdump e lsof em binários adequados para Android (arm-linux-androideabi-g++)
2. Use o adaptador para vincular Listview, CheckBox e List<Program (classe personalizada)>
3. Execute simultaneamente para capturar soquete e pacote, use o comando lsof +c 0 -i -F ctPnf 2>&1
e tcpdump -v -s -w pcap
4. Leia e analise os arquivos /proc/net/tcp, tcp6,udp,udp6
e use o inode do soquete e o pid do aplicativo para estabelecer a aquisição e correspondência entre as cinco tuplas e o nome do aplicativo.
#Implementação (1) Para obter a lista de aplicativos, use o PackageManager para recuperar todos os aplicativos e dados e, em seguida, use ActivityManager e PackagesInfo para obter todos os nomes de aplicativos e pids obtidos acima e exibi-los usando o layout listview.
(2) Para ler e analisar o arquivo /proc/pid/fd no Android, use runTime.exec(cmd); você pode executar o comando cmd no Android, para que possa usá-lo para obter a saída do resultado após executar o comando. Como a leitura e a análise do diretório /proc requerem permissões de root, então runTime.exec("su"); Em seguida, use ls -l /proc/(pid)/fd > /sdcard/fdres
para salvar as informações no arquivo fdres e, em seguida, use cat /sdcard/fdres para extrair as informações. Nas informações obtidas, use a expressão regular "socket:\S(\d+)\S"
;
(3) Leitura e análise de arquivos /proc/net/tcp, tcp6, udp, udp6 (ou use lsof +c 0 -i -F ctPnf 2>&1
) Leitura abstrata de tcp, tcp6, udp, udp6 como PollData Classe, use a classe Scanner que vem com java para analisar e ler /proc/net/tcp, etc.
* 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 ...
*
Em seguida, use o socket_inode obtido acima para encontrar as informações específicas correspondentes nas informações obtidas. As informações específicas do soquete obtidas pela conversão em decimal são as seguintes:
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) Estabelecer a aquisição e o relacionamento correspondente entre o quíntuplo e o nome do aplicativo. O inode de soquete compartilhado por (2) e (3) e o pid do aplicativo são usados para estabelecer a aquisição e a correspondência entre o quíntuplo e o nome do aplicativo. As informações obtidas são salvas no diretório padrão /sdcard/Android/data/com.xx no 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) Faça upload para o servidor e analise usando o script GT ProgramPython