#Résumé AndroidNetMonitor est un système de surveillance passive, de collecte et d'analyse de mesures de paquets fines et à grande échelle à partir d'appareils Android. Il est utilisé pour obtenir des informations d'application réelles sur les sources de trafic et collecter de brèves informations sur les paquets envoyés et reçus par les téléphones mobiles. (c'est-à-dire l'IP source, le port source, l'IP de destination, le port de destination et le protocole de couche de transport), et enregistrez à quelle application mobile correspond chaque message en fonction du socket. Ces données sont stockées dans des fichiers sur la carte SD du téléphone mobile.
Les informations qui doivent être enregistrées dans chaque ligne du fichier comprennent : les informations à 5 tuples de chaque socket réseau (c'est-à-dire l'adresse IP source, le port source, l'adresse IP de destination, le port de destination et le protocole de couche de transport), la durée d'enregistrement, le nom de l'application et le protocole correspondant. Événements (créer/détruire des sockets, etc.).
#Technologie 1. Recompilez tcpdump et lsof en binaires adaptés à Android (arm-linux-androideabi-g++)
2. Utilisez Adapter pour lier Listview, CheckBox et List<Program (classe personnalisée)>
3. Exécutez simultanément pour capturer Socket et Packet, utilisez la commande lsof +c 0 -i -F ctPnf 2>&1
et tcpdump -v -s -w pcap
4. Lisez et analysez les fichiers /proc/net/tcp, tcp6,udp,udp6
, et utilisez l'inode du socket et le pid de l'application pour établir l'acquisition et la correspondance entre le cinq-tuple et le nom de l'application.
#Implémentation (1) Pour obtenir la liste des applications, utilisez PackageManager pour récupérer toutes les applications et données, puis utilisez ActivityManager et PackagesInfo pour obtenir tous les noms d'applications et pids obtenus ci-dessus et affichez-les à l'aide de la disposition listview.
(2) Pour lire et analyser le fichier /proc/pid/fd sous Android, utilisez runTime.exec(cmd) ; vous pouvez exécuter la commande cmd sous Android, vous pouvez donc l'utiliser pour obtenir le résultat après avoir exécuté la commande. Étant donné que la lecture et l'analyse du répertoire /proc nécessitent des autorisations root, runTime.exec("su"); est utilisé pour extraire les autorisations root sur Android. Utilisez ensuite ls -l /proc/(pid)/fd > /sdcard/fdres
pour enregistrer les informations dans le fichier fdres, puis utilisez cat /sdcard/fdres pour extraire les informations. Il s'agit d'un compromis. Dans les informations obtenues, utilisez l'expression régulière "socket:\S(\d+)\S"
; pour extraire toutes les étiquettes d'inodes du socket et les placer dans ArrayList.
(3) Lecture et analyse des fichiers /proc/net/tcp, tcp6, udp, udp6 (ou utilisez lsof +c 0 -i -F ctPnf 2>&1
) Lecture abstraite de tcp, tcp6, udp, udp6 comme PollData Classe, utilisez la classe Scanner fournie avec Java pour analyser et lire /proc/net/tcp, etc. Le résultat obtenu est le suivant
* 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 ...
*
Utilisez ensuite le socket_inode obtenu ci-dessus pour trouver les informations spécifiques correspondantes dans les informations obtenues. Les informations spécifiques sur le socket obtenues en les convertissant en décimal sont les suivantes :
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) Établir l'acquisition et la relation correspondante entre le quintuple et le nom de l'application. L'inode de socket partagé par (2) et (3) et le pid de l'application sont utilisés pour établir l'acquisition et la correspondance entre le quintuple et le nom de l'application. .Les informations obtenues sont enregistrées dans le répertoire par défaut /sdcard/Android/data/com.xx au format .
"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) Téléchargez sur le serveur et analysez à l'aide du script GT ProgramPython