
🔬 أداة بحث متقدمة لنظام أندرويد لالتقاط صوت VoIP في الوقت الفعلي (Uplink/Downlink) عبر الربط الديناميكي بمكتبة libaudioflinger.so. تم اختبارها وبناؤها على واتساب وسيجنال وتيليجرام على أندرويد 14.
الهدف: توضيح التقاط تدفق VoIP عبر خطاف (hook) في audioserver بنظام أندرويد (وتحديدًا libaudioflinger.so) وتسجيل مخازن PCM للرابط الصاعد (الميكروفون) والرابط الهابط (مكبر الصوت) عندما يكون النظام في وضع الاتصال.
تطبيق التحكم (أندرويد)
واجهة مستخدم تحتوي على 9 أزرار لإدارة إعداد سياسات SELinux، وحقن الحمولة، ونقل البيانات، والتشغيل.
الحمولة (libaudiohook.so)
مكتبة مشتركة بلغة C++ (تُبنى كجزء من مشروع التطبيق) تقوم بعمل خطاف للطرق الداخلية في AudioFlinger باستخدام Dobby وتكتب مخازن PCM الخام إلى مجلد الجلسة.
المعالجة اللاحقة
أداة إضافية، tools/audioparser.py، تحوّل ملفات .ac (رابط هابط) / .bc (رابط صاعد) الخام إلى WAV. ويمكن لمدير الملفات في التطبيق أيضًا التحويل والتشغيل داخل التطبيق.
أدوات بحثية
سكربتات Frida لتتبع الدوال واكتشاف الإزاحات مبدئيًا؛ وملفات تحليل للرموز/الإزاحات ومقاطع أخرى.
يوفّر تطبيق أندرويد هذا واجهة رسومية لإدارة تسجيل VoIP عبر audioserver. ويتكامل مع حمولة أصلية تعمل كخطاف في مكدس الصوت بنظام أندرويد لالتقاط صوت الميكروفون ومكبر الصوت من تطبيقات VoIP.
يعمل التطبيق كمركز تحكم، إذ يتيح لك حقن سياسات SELinux المطلوبة، وبدء/إيقاف المراقبة، وإدارة البيانات المسجلة، وتشغيل ملفات صوت VoIP الملتقطة.
يحتوي النشاط الرئيسي على 9 أزرار تحكم:
حقن السياسات
يحقن سياسات SELinux المطلوبة لكي يعمل audioserver وهذا التطبيق معًا.
بدء المراقبة
يحقن الحمولة (المكتبة المشتركة) في audioserver، ما يتيح التقاط صوت VoIP عبر خطاف في RecordTrack وPlaybackTrack. يستخدم AndKittyInjector لحقن العمليات.
إيقاف المراقبة
يعيد تشغيل عملية audioserver، فيوقف المراقبة ويزيل الخطافات المحقونة.
نسخ البيانات
ينسخ صوت PCM الخام الملتقط من المجلد المؤقت /data/local/tmp/voip إلى /sdcard/voip.
عرض السجلات
يعرض السجلات المتعلقة بالحقن والخطاف وحالة التسجيل.
تفعيل SELinux
يستعيد وضعَ الإلزام (enforcing) في SELinux.
تعطيل SELinux
يضبط SELinux على الوضع المتساهل (permissive). استخدمه عند فشل السياسات المحقونة.
تشغيل الصوتيات
يفتح مدير ملفات VoIP المخصص (/sdcard/voip/):
حذف البيانات
يحذف جميع البيانات الصوتية من /data/local/tmp/voip و/sdcard/voip معًا.
ملاحظة: بعد حذف البيانات، نحتاج إلى إعادة الحقن في audioserver حتى يتم إنشاء المجلد لحفظ البيانات.
+----------------------+
| |
| App MainActivity |
| |
| |
|(9 Control Buttons UI)|
| |
| |
+----------+-----------+
|
|
|
+----------v-----------+
| |
| JNI Layer |
| |
| Selinux, Process Inje|
| ction, |
| |
| |
+----------------------+
تُحقن هذه المكتبة المشتركة في audioserver لكشف AUDIO_MODE_IN_COMMUNICATION والتقاط تدفقات صوت VoIP مباشرةً من مكدس الصوت في أندرويد لمجموعة محددة مسبقًا من أسماء الحزم.
يستخدم إطار عمل الخطاف المضمّن Dobby لاعتراض طرق حرجة داخل libaudioflinger.so.
يتم التقاط كل من تدفقي الصوت الرابط الصاعد (الميكروفون) والرابط الهابط (مكبر الصوت) وكتابتهما في ملفات الجلسة لمعالجتها لاحقًا.
تثبّت المكتبة خطافات على الدوال التالية داخل AudioFlinger والطبقات ذات الصلة:
| Function | Purpose |
|---|---|
AudioFlinger::setMode | يتتبع الانتقال إلى/من وضع IN_COMMUNICATION (نشاط VoIP). |
RecordTrack::getNextBuffer | يلتقط إطارات صوت الميكروفون (الرابط الصاعد). |
PlaybackThread::Track::getNextBuffer | يلتقط إطارات صوت مكبر الصوت (الرابط الهابط). |
Track::stop | يغلق ملف الرابط الهابط وينهيه. |
RecordTrack::stop | يغلق ملف الرابط الصاعد وينهيه. |
تفلتر المكتبة التدفقات بناءً على تعيين UID إلى الحزمة.
التطبيقات المراقبة حاليًا:
com.whatsappcom.whatsapp.w4b (واتساب للأعمال)org.thoughtcrime.securesms (Signal)org.telegram.messengerorg.telegram.messenger.webيمكنك إضافة تطبيقات أخرى أيضًا داخل audioserver_hook.cpp:
static const char* kTargetPackages[] = {
"com.whatsapp",
"com.whatsapp.w4b",
"org.thoughtcrime.securesms",
"org.telegram.messenger",
"org.telegram.messenger.web"
};
يتم إنشاء مجلد جلسة عند الحقن في audioserver تحت المسار:
/data/local/tmp/voip/audioserver_session_<timestamp>/
تُنشأ الملفات أولاً بامتداد .tmp، ثم يُعاد تسميتها عند إيقاف المسار:
<packageName>_<sampleRate>_<timestamp>.bc<packageName>_<sampleRate>_<timestamp>.acمثال على جلسة:
/data/local/tmp/voip/audioserver_session_1725389200/
├── com.whatsapp_48000_1725389201_123456.ac
├── com.whatsapp_48000_1725389201_123789.bc
بما أن المكتبة المستهدفة مجرّدة (stripped) والطرق غير مُصدَّرة في libaudioflinger.so، نحتاج إلى إزاحات دقيقة للطرق والمكوّنات الأخرى ذات الصلة لنجاح عملية الخطاف.
يمكننا استخراج هذه الإزاحات من التحليل الساكن باستخدام IDA-PRO أو من التحليل الديناميكي باستخدام frida.
وبمجرد معرفة الإزاحات يمكننا استبدالها داخل ملف الترويسة offsets.h.
android::AudioFlinger::setMode(audio_mode_t)_ZN7android12AudioFlinger7setModeE11audio_mode_tandroid::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer *)_ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferEandroid::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer *)_ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferEandroid::AudioFlinger::PlaybackThread::Track::stop(void)_ZN7android12AudioFlinger14PlaybackThread5Track4stopEvandroid::AudioFlinger::RecordThread::RecordTrack::stop(void)_ZN7android12AudioFlinger12RecordThread11RecordTrack4stopEvيمكن الحصول عليها من التحليل الساكن.
libaudioflinger.soandroid::AudioFlinger::ThreadBase::TrackBase::TrackBase