Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
AudioServer-Voip-Recorder — 🔬 أداة بحث متقدمة لنظام أندرويد لالتقاط صوت VoIP في الوقت الفعلي (Uplink/Downlink) عبر الربط الديناميكي بمكتبة libaudioflinger.so. تم اختبارها وبناؤها على واتساب وسيجنال وتيليجرام على أندرويد 14. | Kitploit
أدوات/GitHubGitHub/nighthawkk/audioserver-voip-recorder
أمان أندرويدالهندسة العكسيةأمن الجوال
GitHubnighthawkk/audioserver-voip-recorder

AudioServer-Voip-Recorder

🔬 أداة بحث متقدمة لنظام أندرويد لالتقاط صوت VoIP في الوقت الفعلي (Uplink/Downlink) عبر الربط الديناميكي بمكتبة libaudioflinger.so. تم اختبارها وبناؤها على واتساب وسيجنال وتيليجرام على أندرويد 14.

عرض المستودع

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
منذ 9س 28دلم تتم المراجعة بعد

الهدف: توضيح التقاط تدفق 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 أزرار تحكم:

  1. حقن السياسات
    يحقن سياسات SELinux المطلوبة لكي يعمل audioserver وهذا التطبيق معًا.

  2. بدء المراقبة
    يحقن الحمولة (المكتبة المشتركة) في audioserver، ما يتيح التقاط صوت VoIP عبر خطاف في RecordTrack وPlaybackTrack. يستخدم AndKittyInjector لحقن العمليات.

  3. إيقاف المراقبة
    يعيد تشغيل عملية audioserver، فيوقف المراقبة ويزيل الخطافات المحقونة.

  4. نسخ البيانات
    ينسخ صوت PCM الخام الملتقط من المجلد المؤقت /data/local/tmp/voip إلى /sdcard/voip.

    • ينظّف المجلد المؤقت بعد ذلك.
  5. عرض السجلات
    يعرض السجلات المتعلقة بالحقن والخطاف وحالة التسجيل.

  6. تفعيل SELinux
    يستعيد وضعَ الإلزام (enforcing) في SELinux.

  7. تعطيل SELinux
    يضبط SELinux على الوضع المتساهل (permissive). استخدمه عند فشل السياسات المحقونة.

  8. تشغيل الصوتيات
    يفتح مدير ملفات VoIP المخصص (/sdcard/voip/):

    • يحوّل ملفات PCM الخام إلى صيغة WAV في الذاكرة.
    • يشغّل الصوت المحوّل مباشرة داخل التطبيق.
root@kitploit:~
+----------------------+    
|                      |    
|   App MainActivity   |    
|                      |    
|                      |    
|(9 Control Buttons UI)|    
|                      |    
|                      |    
+----------+-----------+    
           |                
           |                
           |                
+----------v-----------+    
|                      |    
|       JNI Layer      |    
|                      |    
| Selinux, Process Inje|    
| ction,               |    
|                      |    
|                      |    
+----------------------+    

حمولة الخطاف

تُحقن هذه المكتبة المشتركة في audioserver لكشف AUDIO_MODE_IN_COMMUNICATION والتقاط تدفقات صوت VoIP مباشرةً من مكدس الصوت في أندرويد لمجموعة محددة مسبقًا من أسماء الحزم.

يستخدم إطار عمل الخطاف المضمّن Dobby لاعتراض طرق حرجة داخل libaudioflinger.so.
يتم التقاط كل من تدفقي الصوت الرابط الصاعد (الميكروفون) والرابط الهابط (مكبر الصوت) وكتابتهما في ملفات الجلسة لمعالجتها لاحقًا.

نقاط الخطاف

تثبّت المكتبة خطافات على الدوال التالية داخل AudioFlinger والطبقات ذات الصلة:

التطبيقات المستهدفة

تفلتر المكتبة التدفقات بناءً على تعيين UID إلى الحزمة.

التطبيقات المراقبة حاليًا:

  • com.whatsapp
  • com.whatsapp.w4b (واتساب للأعمال)
  • org.thoughtcrime.securesms (Signal)
  • org.telegram.messenger
  • org.telegram.messenger.web

يمكنك إضافة تطبيقات أخرى أيضًا داخل audioserver_hook.cpp:

root@kitploit:~
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
  • مثال على جلسة:

root@kitploit:~
	/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.

الإزاحات المطلوبة:
الطرق:
  1. AUDIOFLINGER_SETMODE_OFFSET
    • الطريقة: android::AudioFlinger::setMode(audio_mode_t)
    • الاسم المشوّه (Mangled name): _ZN7android12AudioFlinger7setModeE11audio_mode_t
  2. RECORDTRACK_GETNEXTBUFFER_OFFSET
    • الطريقة: android::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer *)
    • الاسم المشوّه (Mangled name): _ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferE
  3. TRACK_GETNEXTBUFFER_OFFSET
    • الطريقة: android::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer *)
    • الاسم المشوّه (Mangled name): _ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferE
  4. TRACK_STOP_OFFSET
    • الطريقة: android::AudioFlinger::PlaybackThread::Track::stop(void)
    • الاسم المشوّه (Mangled name): _ZN7android12AudioFlinger14PlaybackThread5Track4stopEv
إزاحات أخرى:
  1. SAMPLERATE_OFFSET
  2. UID_OFFSET
  3. ISOUT_OFFSET
  4. FORMAT_OFFSET
  5. CHANNELMASK_OFFSET
  6. ATTR_OFFSET

يمكن الحصول عليها من التحليل الساكن.

  • المكتبة - libaudioflinger.so
  • الطريقة - android::AudioFlinger::ThreadBase::TrackBase::TrackBase
root@kitploit:~
TrackBase::TrackBase(
        IAfThreadBase *thread,
            const sp<Client>& client,
            const audio_attributes_t& attr,
            uint32_t sampleRate,
            audio_format_t format,
            audio_channel_mask_t channelMask,
            size_t frameCount,
            void *buffer,
            size_t bufferSize,
            audio_session_t sessionId,
            pid_t creatorPid,
            uid_t clientUid,
            bool isOut,
            const alloc_type alloc,
            track_type type,
            audio_port_handle_t portId,
            std::string metricsId)

ملاحظات

  • يتم التقاط وضع IN_COMMUNICATION فقط. ويتم تجاهل الصوت العادي (الموسيقى، نغمة الرنين، إلخ).
  • تفرض معالجة خاصة لـTelegram وSignal معدلات العينات الصحيحة (Telegram: 48000 هرتز، Signal: 8000 هرتز) لتجاهل الأصوات غير الضرورية الأخرى مثل رنين الهاتف وأصوات انتهاء المكالمة.
  • يُخزَّن PCM خامًا؛ ويقوم تطبيق التحكم لاحقًا بتحويل PCM إلى WAV للتشغيل.
root@kitploit:~
 ┌─────────────────────────────┐
 │        VoIP Apps            │
 │  (WhatsApp / Signal / TG)   │
 └───────────────┬─────────────┘
                 │ Audio in/out
                 ▼
 ┌─────────────────────────────┐
 │       audioserver           │
 │  (libaudioflinger.so)       │
 └───────┬─────────┬───────────┘
         │         │
   uplink│         │downlink
 (mic)   │         │(speaker)
         ▼         ▼
 ┌───────────-──┐   ┌────────────-─┐
 │ RecordTrack  │   │  Track       │
 │ getNextBuffer│   │ getNextBuffer│
 └───────┬────-─┘   └───────┬────-─┘
         │                 │
   ┌─────▼─────┐     ┌─────▼─────┐
   │ hook_...  │     │ hook_...  │
   │ (uplink)  │     │ (downlink)│
   └─────┬─────┘     └─────┬─────┘
         │                 │
         └──────┬───┬──────┘
                │   │
                ▼   ▼
     ┌───────────────────────────┐
     │  /data/local/tmp/voip/    │
     │  audioserver_session_*    │
     │   - *.bc  (uplink)        │
     │   - *.ac  (downlink)      │
     └───────────────────────────┘

تحديد الدالة المستهدفة

العملية المستخدمة:

  1. التتبع الديناميكي - Frida:
    • استُخدمت Frida لتتبع جميع استدعاءات الدوال أثناء مكالمة VoIP.
    • تمت تصفية جميع الدوال المسؤولة عن معالجة مخازن الصوت.
    • ثم أُنشئت سكربتات Frida لالتقاط مخازن الصوت ومعالجتها.
  2. مراجعة AOSP وتعيين الطبقات
    • يدير AudioFlinger التشغيل/الالتقاط عبر PlaybackThread وRecordThread.
    • يتم تمثيل الصوت لكل عميل عبر PlaybackThread::Track (الرابط الهابط) وRecordThread::RecordTrack (الرابط الصاعد).
  3. التصفية إلى تدفقات خاصة بالتطبيق
    • استُخدم تعيين UID→package لتقييد التطبيقات المستهدفة.
  4. الثبات والإزاحات
    • تحلّ الحمولة الأصلية النهائية العناوين عبر base + إزاحات مكتوبة يدويًا (موجودة في app/src/main/cpp/include/offsets.h) لتفادي الرموز المجرّدة.

كشف MODE_IN_COMMUNICATION

نقوم بتعليق خطاف على AudioFlinger::setMode(int mode) ونحتفظ بحالة عامة:

  • عند كل استدعاء، نسجّل تغيير الوضع ونحدّث g_currentAudioMode.
  • تتحقق الخطافات (في خطافي الميكروفون ومكبر الصوت معًا) من g_currentAudioMode == AUDIO_MODE_IN_COMMUNICATION.
  • يضمن هذا تفريغ المخازن فقط أثناء جلسة VoIP نشطة، متجنبًا الموسيقى/نغمات الرنين/تشغيل الجهاز/تسجيلات الميكروفون وما إلى ذلك.

بناء وتشغيل الـ PoC

هيكل المشروع

root@kitploit:~
.
├── Android_App/ 
|   ├── app/                           # Android Studio project (App + Payload)
|	│   ├── src/
|	│   │   ├── main/
|	│   │   │   ├── java/              # Controller App Java/Kotlin sources
|	│   │   │   ├── cpp/               # Payload source (built with the app)
|	│   │   │   │   └── include/
|	│   │   │   │       └── offsets.h  # Function offsets for tested builds
├── tools/
│   ├── audioparser.py             # Converts .ac/.bc raw files → WAV
│   ├── frida/                     # Frida scripts for initial hook discovery
│   │   ├── host_audioserver.py
│   │   ├── agent_audioserver.js
├── app-release.apk                 # Signed release apk
└── README.md                       # Root README (design, build, run instructions)

المتطلبات الأساسية

  • أندرويد ستوديو + NDK
  • محاكٍ بصلاحية الروت (مثل rootAVD) أو جهاز اختبار تملكه (مثل Magisk)
  • تثبيت تطبيقات VoIP للاختبار (نفس التطبيقات التي تملكها/تديرها)
  • Python لتشغيل audioparser.py

بناء التطبيق (والذي يبني الحمولة أيضًا)

  1. افتح app/ في أندرويد ستوديو.
  2. تأكد من تثبيت NDK (SDK Manager ← SDK Tools ← NDK).
  3. ابنِ نسخة Debug. سيقوم إعداد Gradle/CMake بتجميع الحمولة الأصلية (libaudiohook.so) كجزء من المشروع.

التثبيت على جهاز الاختبار

adb install -r app/build/outputs/apk/debug/app-debug.apk أو ثبّت app-release.apk المرفق: adb install -r app-release.apk

إذا فصلت المخرجات، يمكنك أيضًا دفع المكتبة المشتركة للاختبار: adb push app/src/main/jniLibs/arm64-v8a/libaudiohook.so /data/local/tmp/

تشغيل الـ PoC (محاكٍ/جهاز مملوك)

  1. شغّل تطبيق التحكم ← امنح صلاحية الروت عند الطلب.
  2. اضغط على "حقن السياسات"
    يجهّز قواعد SELinux المطلوبة للتفاعل بين التطبيق وaudioserver في بيئة الاختبار.
  3. اضغط على "بدء المراقبة"
    يستخدم التطبيق AndKittyInjector لحقن الحمولة في audioserver.
  4. أجرِ مكالمة VoIP اختبارية (مثل حساب WhatsApp/Signal/Telegram الخاص بك).
  5. اضغط على "إيقاف المراقبة"
    يعيد تشغيل audioserver.
  6. اضغط على "نسخ البيانات"
    ينقل ملفات الجلسة من /data/local/tmp/voip/… إلى /sdcard/voip/ (وينظف المجلد المؤقت).
  7. التشغيل
    • داخل التطبيق: "تشغيل الصوتيات" يحوّل PCM إلى WAV ويشغّلها.
    • أو خارجيًا:
      root@kitploit:~
       adb pull /sdcard/voip/
      python3 tools/audioparser.py voip/
      

أزرار إضافية:

  • "عرض السجلات": للاطلاع على حالة الحقن/الخطاف.
  • "تفعيل SELinux" / "تعطيل SELinux": للتبديل بين الإلزام/التساهل في بيئة الاختبار إذا كانت السياسات صارمة للغاية.
  • "حذف البيانات": لمسح كل من /data/local/tmp/voip/ و/sdcard/voip/.

الإصدارات والأجهزة المختبرة

  • المحاكي: AVD API 34 (x86_64) - أندرويد 14 - بصلاحية الروت عبر rootAVD
  • الجهاز: Samsung Galaxy S22 (ARM64) - أندرويد 14 - الإصدار S901EXXSCEYB1 - بصلاحية الروت عبر Magisk

التطبيقات المختبرة

  • Whatsapp
  • Whatsapp Business
  • Signal
  • Telegram

التحديات والحلول البارزة

  1. الرموز المجرّدة
    • المشكلة: لا يمكن تحديد موقع الرموز مباشرة عبر dlsym.
    • الحل: استخدام الإزاحات المستخرجة من التحليل الساكن.
  2. اختلاف الرموز/الإزاحات بين الإصدارات
    • المشكلة: تختلف الرموز المجرّدة حسب الإصدار؛ وقد يفشل dlsym المباشر.
    • الحل: استخدام base + إزاحات مكتوبة يدويًا للإصدارات المختبرة (offsets.h)، مع التحقق منها عبر تفريغات رموز Frida وIDA-PRO.
  3. دقة كشف الوضع
    • المشكلة: التسجيل خارج جلسات VoIP ينتج بيانات مشوشة.
    • الحل: ربط الالتقاط بـ AudioFlinger::setMode(IN_COMMUNICATION)؛ تسجيل التحولات؛ تخزين علامة وضع عامة.
  4. SELinux
    • المشكلة: قد يُحظر الكتابة إلى المجلدات المؤقتة وIPC مع audioserver.
    • الحل: توفير خطوة حقن السياسات لإضافة القواعد اللازمة؛ وإتاحة مفاتيح تفعيل/تعطيل SELinux لتصحيح الأخطاء في بيئات الاختبار.
  5. دورة حياة الملفات وإعادة التسمية
    • المشكلة: تجنّب المخرجات الجزئية/التالفة عند إيقاف المسار.
    • الحل: الكتابة إلى .tmp أولاً؛ وعند stop() إعادة التسمية إلى .ac (رابط هابط) أو (رابط صاعد).

المراجع (مفتوحة المصدر والوثائق)

  • Dobby (إطار عمل الخطاف المضمّن) - https://www.github.com/jmpews/Dobby
  • AndKittyInjector (أداة حقن عمليات أندرويد) - https://github.com/MJx0/AndKittyInjector
  • AOSP
    • frameworks/av/services/audioflinger (AudioFlinger, PlaybackThread, RecordThread)
    • system/media/audio (audio formats, attributes, channel masks)
تنزيل الأداة
  • حذف البيانات
    يحذف جميع البيانات الصوتية من /data/local/tmp/voip و/sdcard/voip معًا. ملاحظة: بعد حذف البيانات، نحتاج إلى إعادة الحقن في audioserver حتى يتم إنشاء المجلد لحفظ البيانات.

  • FunctionPurpose
    AudioFlinger::setModeيتتبع الانتقال إلى/من وضع IN_COMMUNICATION (نشاط VoIP).
    RecordTrack::getNextBufferيلتقط إطارات صوت الميكروفون (الرابط الصاعد).
    PlaybackThread::Track::getNextBufferيلتقط إطارات صوت مكبر الصوت (الرابط الهابط).
    Track::stopيغلق ملف الرابط الهابط وينهيه.
    RecordTrack::stopيغلق ملف الرابط الصاعد وينهيه.
  • RECORDTRACK_STOP_OFFSET
    • الطريقة: android::AudioFlinger::RecordThread::RecordTrack::stop(void)
    • الاسم المشوّه (Mangled name): _ZN7android12AudioFlinger12RecordThread11RecordTrack4stopEv
  • .bc
  • لا توجد خطافات PLT في libaudioflinger.so
    • المشكلة: الدوال المستهدفة (RecordTrack::getNextBuffer, Track::getNextBuffer, إلخ) غير مُصدَّرة، وlibaudioflinger.so لا يحتوي على مدخلات PLT/GOT لها.
      • لم نتمكن من استخدام آليات dlsym() القياسية أو الخطاف المعتمد على PLT.
    • الحل: استخدمنا Dobby لخطاف الدوال المضمّن (inline hooking).
      • تُثبَّت الخطافات في وقت التشغيل باستخدام المعادلة:
        root@kitploit:~
        target_addr = base_addr(libaudioflinger) + offset
        DobbyHook(target_addr, hook_fn, &orig_fn)