#Zusammenfassung AndroidNetMonitor ist ein System zur passiven Überwachung, Sammlung und Analyse feinkörniger, umfangreicher Paketmessungen von Android-Geräten. Es wird verwendet, um echte Anwendungsinformationen über Verkehrsquellen zu erhalten und kurze Informationen über von Mobiltelefonen gesendete und empfangene Pakete zu sammeln (d. h. Quell-IP, Quell-Port, Ziel-IP, Ziel-Port und Transportschichtprotokoll) und notieren Sie, welcher mobilen App jede Nachricht entsprechend dem Socket entspricht. Diese Daten werden in Dateien auf der SD-Karte des Mobiltelefons gespeichert.
Zu den Informationen, die in jeder Zeile der Datei aufgezeichnet werden müssen, gehören: 5-Tupel-Informationen jedes Netzwerk-Sockets (d. h. Quell-IP, Quell-Port, Ziel-IP, Ziel-Port und Transportschichtprotokoll), Aufzeichnungszeit, Anwendungsname und entsprechende Informationen Ereignisse (Sockets erstellen/zerstören usw.).
#Technologie 1. Kompilieren Sie tcpdump und lsof neu in für Android geeignete Binärdateien (arm-linux-androideabi-g++).
2. Verwenden Sie den Adapter, um Listview, CheckBox und List<Program (custom class)> zu binden
3. Führen Sie die gleichzeitige Ausführung aus, um Socket und Paket zu erfassen. Verwenden Sie dazu die Befehle lsof +c 0 -i -F ctPnf 2>&1
und tcpdump -v -s -w pcap
4. Lesen und analysieren Sie die Dateien /proc/net/tcp, tcp6,udp,udp6
und verwenden Sie den Socket-Inode und die PID der App, um die Erfassung und Korrespondenz zwischen dem Fünf-Tupel und dem Anwendungsnamen herzustellen.
#Implementierung (1) Um die App-Liste zu erhalten, verwenden Sie den PackageManager, um alle Anwendungen und Daten abzurufen. Verwenden Sie dann ActivityManager und PackagesInfo, um alle oben erhaltenen App-Namen und PIDs abzurufen, und zeigen Sie sie mithilfe des Listenansichtslayouts an.
(2) Um die Datei /proc/pid/fd in Android zu lesen und zu analysieren, verwenden Sie runTime.exec(cmd); Sie können den Befehl cmd in Android ausführen, um die Ergebnisausgabe nach der Ausführung des Befehls zu erhalten. Da für das Lesen und Analysieren des Verzeichnisses /proc Root-Berechtigungen erforderlich sind, wird runTime.exec("su"); zum Extrahieren von Root-Berechtigungen auf Android verwendet. Verwenden Sie dann ls -l /proc/(pid)/fd > /sdcard/fdres
um die Informationen in der fdres-Datei zu speichern, und verwenden Sie dann cat /sdcard/fdres, um die Informationen zu extrahieren. Dies ist ein Kompromiss. Verwenden Sie in den erhaltenen Informationen den regulären Ausdruck "socket:\S(\d+)\S"
, um alle Inode-Labels des Sockets zu extrahieren und in die ArrayList einzufügen.
(3) Lesen und Parsen von /proc/net/tcp, tcp6, udp, udp6-Dateien (oder verwenden Sie lsof +c 0 -i -F ctPnf 2>&1
). Abstraktes Lesen von tcp, tcp6, udp, udp6 als PollData Klasse: Verwenden Sie die mit Java gelieferte Scanner-Klasse, um /proc/net/tcp usw. zu analysieren und zu lesen. Die erhaltene Ausgabe ist wie folgt
* 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 ...
*
Verwenden Sie dann den oben erhaltenen socket_inode, um die entsprechenden spezifischen Informationen in den erhaltenen Informationen zu finden. Die durch Konvertierung in Dezimalzahlen erhaltenen spezifischen Socket-Informationen lauten wie folgt:
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) Stellen Sie die Erfassung und entsprechende Beziehung zwischen dem Fünffach und dem Anwendungsnamen her. Der von (2) und (3) gemeinsam genutzte Socket-Inode und die PID der App werden verwendet, um die Erfassung und Korrespondenz zwischen dem Fünffach und dem Anwendungsnamen herzustellen Die erhaltenen Informationen werden im Standardverzeichnis /sdcard/Android/data/com.xx im Format gespeichert
"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) Auf den Server hochladen und mit dem GT ProgramPython-Skript analysieren