#Ringkasan AndroidNetMonitor adalah sistem untuk pemantauan pasif, pengumpulan, dan analisis pengukuran paket skala besar yang terperinci dari perangkat Android. Sistem ini digunakan untuk memperoleh informasi aplikasi nyata dari sumber lalu lintas dan mengumpulkan informasi singkat tentang paket yang dikirim dan diterima oleh ponsel (yaitu IP Sumber, port sumber, IP tujuan, port tujuan, dan protokol lapisan transport), dan mencatat aplikasi seluler mana yang sesuai dengan setiap pesan sesuai dengan soketnya.
Informasi yang perlu dicatat di setiap baris file meliputi: informasi 5 tupel dari setiap soket jaringan (yaitu IP sumber, port sumber, IP tujuan, port tujuan dan protokol lapisan transport), waktu perekaman, nama aplikasi, dan terkait Acara (membuat/menghancurkan soket, dll.).
#Teknologi 1. Kompilasi ulang tcpdump dan lsof menjadi biner yang sesuai untuk Android (arm-linux-androideabi-g++)
2. Gunakan Adaptor untuk mengikat Tampilan Daftar, Kotak Centang, dan Daftar<Program (kelas khusus)>
3. Jalankan secara bersamaan untuk menangkap Socket dan Paket, gunakan perintah lsof +c 0 -i -F ctPnf 2>&1
dan tcpdump -v -s -w pcap
4. Baca dan parsing file /proc/net/tcp, tcp6,udp,udp6
, dan gunakan inode soket dan pid aplikasi untuk menetapkan akuisisi dan korespondensi antara lima tupel dan nama aplikasi.
#Implementasi (1) Untuk mendapatkan daftar aplikasi, gunakan PackageManager untuk mengambil semua aplikasi dan data, lalu gunakan ActivityManager dan PackagesInfo untuk mendapatkan semua nama dan pid aplikasi yang diperoleh dari atas, dan tampilkan menggunakan tata letak tampilan daftar.
(2) Untuk membaca dan mengurai file /proc/pid/fd di Android, gunakan runTime.exec(cmd); Anda dapat menjalankan perintah cmd di Android, sehingga Anda dapat menggunakan ini untuk mendapatkan hasil keluaran setelah menjalankan perintah. Karena Membaca dan menganalisis direktori /proc memerlukan izin root, maka runTime.exec("su"); Kemudian gunakan ls -l /proc/(pid)/fd > /sdcard/fdres
untuk menyimpan informasi ke file fdres, lalu gunakan cat /sdcard/fdres untuk mengekstrak informasi. Dalam informasi yang diperoleh, gunakan ekspresi reguler "socket:\S(\d+)\S"
; untuk mengekstrak semua label inode soket dan memasukkannya ke dalam ArrayList.
(3) Membaca dan menguraikan file /proc/net/tcp, tcp6, udp, udp6 (atau menggunakan perintah lsof +c 0 -i -F ctPnf 2>&1
) Pembacaan abstrak tcp, tcp6, udp, udp6 sebagai PollData Kelas, gunakan kelas Pemindai yang disertakan dengan Java untuk menganalisis dan membaca /proc/net/tcp, dll. Output yang diperoleh adalah sebagai berikut
* 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 ...
*
Kemudian gunakan socket_inode yang diperoleh di atas untuk mencari informasi spesifik terkait dalam informasi yang diperoleh. Informasi soket spesifik yang diperoleh dengan mengubahnya menjadi desimal adalah sebagai berikut:
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) Membangun akuisisi dan hubungan yang sesuai antara quintuple dan nama aplikasi. Inode soket yang digunakan bersama oleh (2) dan (3) dan pid aplikasi digunakan untuk menetapkan akuisisi dan korespondensi antara quintuple dan nama aplikasi. . Informasi yang diperoleh disimpan ke direktori default /sdcard/Android/data/com.xx dalam 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) Unggah ke server dan parsing menggunakan skrip GT ProgramPython