#Summary AndroidNetMonitor เป็นระบบสำหรับการตรวจสอบ การรวบรวม และการวิเคราะห์การวัดแพ็กเก็ตขนาดใหญ่แบบละเอียดจากอุปกรณ์ Android ใช้เพื่อรับข้อมูลแอปพลิเคชันจริงของแหล่งที่มาของการรับส่งข้อมูล และรวบรวมข้อมูลโดยย่อของแพ็กเก็ตที่ส่งและรับทางโทรศัพท์มือถือ (เช่น IP ต้นทาง, พอร์ตต้นทาง, IP ปลายทาง, พอร์ตปลายทาง และโปรโตคอลการขนส่งเลเยอร์) และบันทึกว่าแอปมือถือใดที่แต่ละข้อความสอดคล้องกับซ็อกเก็ต ข้อมูลเหล่านี้จะถูกจัดเก็บไว้ในไฟล์ในการ์ด SD ของโทรศัพท์มือถือ
ข้อมูลที่จำเป็นต้องบันทึกในแต่ละบรรทัดของไฟล์ประกอบด้วย: ข้อมูล 5 tuple ของแต่ละซ็อกเก็ตเครือข่าย (เช่น IP ต้นทาง, พอร์ตต้นทาง, IP ปลายทาง, พอร์ตปลายทางและโปรโตคอลเลเยอร์การขนส่ง) เวลาในการบันทึก ชื่อแอปพลิเคชัน และที่เกี่ยวข้อง เหตุการณ์ (สร้าง/ทำลายซ็อกเก็ต ฯลฯ)
#เทคโนโลยี 1. คอมไพล์ tcpdump และ lsof ใหม่ให้เป็นไบนารีที่เหมาะกับ Android (arm-linux-androideabi-g++)
2. ใช้อะแดปเตอร์เพื่อผูก Listview, CheckBox และ List<Program (custom class)>
3. รันพร้อมกันเพื่อจับ Socket และ Packet ใช้คำสั่ง lsof +c 0 -i -F ctPnf 2>&1
และ tcpdump -v -s -w pcap
4. อ่านและแยกวิเคราะห์ไฟล์ /proc/net/tcp, tcp6,udp,udp6
และใช้ซ็อกเก็ตไอโหนดและ pid ของแอปเพื่อสร้างการรับข้อมูลและการโต้ตอบระหว่างห้าทูเพิลและชื่อแอปพลิเคชัน
#Implementation (1) หากต้องการรับรายการแอป ให้ใช้ PackageManager เพื่อดึงแอปพลิเคชันและข้อมูลทั้งหมด จากนั้นใช้ ActivityManager และ PackageInfo เพื่อรับชื่อแอปและ pid ทั้งหมดที่ได้รับจากด้านบน และแสดงโดยใช้เค้าโครง listview
(2) หากต้องการอ่านและแยกไฟล์ /proc/pid/fd ใน Android ให้ใช้ runTime.exec(cmd) คุณสามารถรันคำสั่ง cmd ใน Android เพื่อให้คุณสามารถใช้สิ่งนี้เพื่อรับผลลัพธ์ผลลัพธ์หลังจากรันคำสั่ง เนื่องจากการอ่านและการวิเคราะห์ไดเร็กทอรี /proc ต้องการสิทธิ์รูท ดังนั้น runTime.exec("su"); จึงถูกใช้เพื่อแยกสิทธิ์รูทบน Android จากนั้นใช้ ls -l /proc/(pid)/fd > /sdcard/fdres
เพื่อบันทึกข้อมูลลงในไฟล์ fdres จากนั้นใช้ cat /sdcard/fdres เพื่อแยกข้อมูล นี่เป็นการประนีประนอม ในข้อมูลที่ได้รับ ให้ใช้นิพจน์ทั่วไป "socket:\S(\d+)\S"
; เพื่อแยกป้ายกำกับ inode ทั้งหมดของซ็อกเก็ตและใส่ลงใน ArrayList
(3) การอ่านและการแยกวิเคราะห์ไฟล์ /proc/net/tcp, tcp6, udp, udp6 (หรือใช้คำสั่ง lsof +c 0 -i -F ctPnf 2>&1
) การอ่านบทคัดย่อของ tcp, tcp6, udp, udp6 เป็น PollData คลาสใช้คลาส Scanner ที่มาพร้อมกับ java เพื่อวิเคราะห์และอ่าน /proc/net/tcp เป็นต้น ผลลัพธ์ที่ได้จะเป็นดังนี้
* 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 ...
*
จากนั้นใช้ socket_inode ที่ได้รับด้านบนเพื่อค้นหาข้อมูลเฉพาะที่เกี่ยวข้องในข้อมูลที่ได้รับ ข้อมูลซ็อกเก็ตเฉพาะที่ได้รับจากการแปลงเป็นทศนิยมมีดังนี้:
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) สร้างการได้มาและความสัมพันธ์ที่สอดคล้องกันระหว่าง quintuple และชื่อแอปพลิเคชัน ซ็อกเก็ตไอโหนดที่ใช้ร่วมกันโดย (2) และ (3) และ pid ของแอปใช้เพื่อสร้างการได้มาและการโต้ตอบระหว่าง quintuple และชื่อแอปพลิเคชัน ข้อมูลที่ได้รับจะถูกบันทึกลงในไดเร็กทอรีเริ่มต้น /sdcard/Android/data/com.xx ในรูปแบบ
"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) อัปโหลดไปยังเซิร์ฟเวอร์และแยกวิเคราะห์โดยใช้สคริปต์ GT ProgramPython