#Summary AndroidNetMonitor هو نظام للمراقبة السلبية وجمع وتحليل قياسات الحزم الدقيقة وواسعة النطاق من أجهزة Android، ويتم استخدامه للحصول على معلومات التطبيق الحقيقية لمصادر حركة المرور وجمع معلومات موجزة عن الحزم المرسلة والمستقبلة بواسطة الهواتف المحمولة (أي عنوان IP المصدر، والمنفذ المصدر، وعنوان IP الوجهة، ومنفذ الوجهة، وبروتوكول طبقة النقل)، وتسجيل تطبيق الهاتف المحمول الذي تتوافق معه كل رسالة وفقًا للمقبس. ويتم تخزين هذه البيانات في ملفات على بطاقة SD الخاصة بالهاتف المحمول.
تتضمن المعلومات التي يجب تسجيلها في كل سطر من الملف ما يلي: 5 معلومات لكل مقبس شبكة (أي عنوان IP المصدر، ومنفذ المصدر، وعنوان IP الوجهة، ومنفذ الوجهة، وبروتوكول طبقة النقل)، ووقت التسجيل، واسم التطبيق، والبيانات المقابلة الأحداث (إنشاء/تدمير مآخذ التوصيل، وما إلى ذلك).
#التكنولوجيا 1. إعادة ترجمة tcpdump وlsof إلى ثنائيات مناسبة لنظام Android (arm-linux-androideabi-g++)
2. استخدم المحول لربط Listview وCheckBox وList<Program (فئة مخصصة)>
3. قم بالتشغيل بشكل متزامن لالتقاط المقبس والحزمة، استخدم الأمر lsof +c 0 -i -F ctPnf 2>&1
و tcpdump -v -s -w pcap
4. قم بقراءة وتحليل الملفات /proc/net/tcp, tcp6,udp,udp6
، واستخدم inode مأخذ التوصيل ومعرف معرف التطبيق لتأسيس عملية الاكتساب والمراسلات بين المجموعة الخمسة واسم التطبيق.
#Implementation (1) للحصول على قائمة التطبيقات، استخدم PackageManager لاسترداد جميع التطبيقات والبيانات، ثم استخدم ActivityManager وPackagesInfo للحصول على جميع أسماء التطبيقات ومعرفات التعريف (PID) التي تم الحصول عليها من الأعلى، وعرضها باستخدام تخطيط عرض القائمة.
(2) لقراءة وتحليل الملف /proc/pid/fd في Android، استخدم runTime.exec(cmd); يمكنك تشغيل الأمر cmd في Android، حتى تتمكن من استخدامه للحصول على النتيجة بعد تشغيل الأمر. لأن قراءة وتحليل الدليل /proc يتطلب أذونات الجذر، لذلك يتم استخدام runTime.exec("su"); ثم استخدم 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 Class، استخدم فئة 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 ...
*
ثم استخدم مقبس_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) إنشاء علاقة الاستحواذ والعلاقة المقابلة بين الاسم الخماسي واسم التطبيق. يتم استخدام رمز المقبس المشترك بين (2) و (3) ومعرف الهوية الخاص بالتطبيق لتأسيس الاستحواذ والمراسلات بين الاسم الخماسي واسم التطبيق. يتم حفظ المعلومات التي تم الحصول عليها في الدليل الافتراضي /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