Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
AudioServer-Voip-Recorder — 🔬 libaudioflinger.soを動的にフックすることで、リアルタイムVoIP音声キャプチャ(アップリンク/ダウンリンク)を実現する高度なAndroid研究ツールです。Android 14上のWhatsApp、Signal、Telegramでテストおよび構築済みです。 | Kitploit
ツール/GitHubGitHub/nighthawkk/audioserver-voip-recorder
Androidセキュリティリバースエンジニアリングモバイルセキュリティ
GitHubnighthawkk/audioserver-voip-recorder

AudioServer-Voip-Recorder

🔬 libaudioflinger.soを動的にフックすることで、リアルタイムVoIP音声キャプチャ(アップリンク/ダウンリンク)を実現する高度なAndroid研究ツールです。Android 14上のWhatsApp、Signal、Telegramでテストおよび構築済みです。

リポジトリを見る

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
9時間28分前未レビュー

目標: Android の audioserver(具体的には libaudioflinger.so)をフックし、システムが 通信 モードのときにアップリンク(マイク)とダウンリンク(スピーカー)の PCM バッファを記録することで、VoIP ストリームキャプチャを実演します。

プロジェクト設計と方法論

アーキテクチャ:

  • コントローラーアプリ (Android)
    SELinux ポリシーの設定、ペイロード注入、データ移動、再生を管理する 9 つのボタンを備えた UI。

  • ペイロード (libaudiohook.so)
    Dobby を使用して内部の AudioFlinger メソッドをフックし、生の PCM バッファをセッションディレクトリに書き込む C++ 共有ライブラリ(アプリプロジェクトの一部としてビルド)。

  • 後処理
    追加ツール tools/audioparser.py は、生の .ac(ダウンリンク)/.bc(アップリンク)ファイルを WAV に変換します。アプリのファイルマネージャーでも変換およびアプリ内再生が可能です。

  • 調査ユーティリティ
    初期の関数トレースとオフセット発見のための Frida スクリプト。シンボル/オフセットやその他のスニペットの解析ファイル。

コントローラーアプリ

この Android アプリケーションは、audioserver を介して VoIP 録音を管理するためのグラフィカルインターフェースを提供します。Android オーディオスタックをフックして VoIP アプリケーションのマイク音声とスピーカー音声をキャプチャするネイティブペイロードと統合されています。

このアプリはコントロールセンターとして機能し、必要な SELinux ポリシーの注入、監視の開始/停止、録音データの管理、キャプチャした VoIP 音声ファイルの再生を行うことができます。

機能

メインアクティビティには 9 つのコントロールボタン があります:

  1. ポリシー注入
    audioserver とこのアプリが連携して動作するために必要な SELinux ポリシーを注入します。

  2. 監視開始
    audioserver に共有ライブラリのペイロードを注入し、RecordTrack と PlaybackTrack をフックして VoIP 音声キャプチャを有効にします。プロセス注入には AndKittyInjector を使用します。

  3. 監視停止
    audioserver プロセスを再起動し、監視を停止して注入されたフックを削除します。

  4. データコピー
    キャプチャした 生の PCM オーディオ を一時ディレクトリ /data/local/tmp/voip から /sdcard/voip にコピーします。

    • その後、一時ディレクトリをクリーンアップします。
  5. ログ表示
    注入、フック、録音ステータスに関するログを表示します。

  6. SELinux 有効化
    SELinux の enforcing モードを復元します。

  7. SELinux 無効化
    SELinux を permissive モードに設定します。注入したポリシーが失敗した場合に使用します。

  8. 音声再生
    カスタム VoIP ファイルマネージャー (/sdcard/voip/) を開きます:

    • 生の PCM ファイルをメモリ内で WAV 形式 に変換します。
    • 変換した音声をアプリ内で直接再生します。
  9. データ削除
    /data/local/tmp/voip と の両方からすべての音声データを削除します。 : データ削除後、データを保存するためのディレクトリを作成するには、 への再注入が必要です。

root@kitploit:~
+----------------------+    
|                      |    
|   App MainActivity   |    
|                      |    
|                      |    
|(9 Control Buttons UI)|    
|                      |    
|                      |    
+----------+-----------+    
           |                
           |                
           |                
+----------v-----------+    
|                      |    
|       JNI Layer      |    
|                      |    
| Selinux, Process Inje|    
| ction,               |    
|                      |    
|                      |    
+----------------------+    

フックペイロード

この共有ライブラリは audioserver に注入され、AUDIO_MODE_IN_COMMUNICATION を検出し、事前定義されたパッケージ名のセットに対して Android オーディオスタックから直接 VoIP 音声ストリームをキャプチャします。

Dobby インラインフッキングフレームワークを使用して、libaudioflinger.so 内の重要なメソッドをインターセプトします。
アップリンク(マイク) と ダウンリンク(スピーカー) の両方の音声ストリームがキャプチャされ、後で処理するためにセッションファイルに書き込まれます。

フックポイント

このライブラリは、AudioFlinger および関連クラス内の以下の関数にフックをインストールします:

対象アプリケーション

このライブラリは、UID → パッケージマッピング に基づいてストリームをフィルタリングします。

現在監視中のアプリ:

  • com.whatsapp
  • com.whatsapp.w4b (WhatsApp Business)
  • 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
	

オフセット

ターゲットライブラリはストリップされており、libaudioflinger.so 内でメソッドがエクスポートされていないため、フックを成功させるにはメソッドやその他の関連コンポーネントの正確なオフセットが必要です。

これらのオフセットは、IDA-PRO を使用した静的解析、または frida を使用した動的解析から抽出できます。 オフセットが判明したら、offsets.h ヘッダーファイル内で置き換えることができます。

必要なオフセット:
メソッド:
  1. AUDIOFLINGER_SETMODE_OFFSET
    • メソッド: android::AudioFlinger::setMode(audio_mode_t)
    • マングル名: _ZN7android12AudioFlinger7setModeE11audio_mode_t
  2. RECORDTRACK_GETNEXTBUFFER_OFFSET
    • メソッド: android::AudioFlinger::RecordThread::RecordTrack::getNextBuffer(android::AudioBufferProvider::Buffer *)
    • マングル名: _ZN7android12AudioFlinger12RecordThread11RecordTrack13getNextBufferEPNS_19AudioBufferProvider6BufferE
  3. TRACK_GETNEXTBUFFER_OFFSET
    • メソッド: android::AudioFlinger::PlaybackThread::Track::getNextBuffer(android::AudioBufferProvider::Buffer *)
    • マングル名: _ZN7android12AudioFlinger14PlaybackThread5Track13getNextBufferEPNS_19AudioBufferProvider6BufferE
  4. TRACK_STOP_OFFSET
    • メソッド: android::AudioFlinger::PlaybackThread::Track::stop(void)
    • マングル名: _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 Hz、Signal: 8000 Hz)を強制し、電話の着信音や切断音など他の不要なオーディオを無視します。
  • 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→パッケージマッピングを使用して、対象アプリのみに制限しました。
  4. 安定性とオフセット
    • 最終的なネイティブペイロードは、ストリップされたシンボルに対応するために、ベース + ハードコードされたオフセット(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)

前提条件

  • Android Studio + NDK
  • ルート化された エミュレータ(例: rootAVD)または所有する テストデバイス(例: Magisk)
  • テスト VoIP アプリがインストールされている(自分が所有/管理しているもの)
  • audioparser.py 用の Python

アプリのビルド(ペイロードもビルドされます)

  1. Android Studio で 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. コントローラーアプリを起動し、プロンプトが表示されたら root を許可します。
  2. 「ポリシー注入」 をタップします。
    テスト環境でアプリと audioserver のやり取りに必要な SELinux ルールを準備します。
  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 無効化」: ポリシーが厳しすぎる場合に、ラボ 環境で enforcing/permissive を切り替えます。
  • 「データ削除」: /data/local/tmp/voip/ と /sdcard/voip/ の両方をクリアします。

テスト済みバージョンとデバイス

  • エミュレータ: AVD API 34 (x86_64) - Android 14 - rootAVD で root 化
  • デバイス: Samsung Galaxy S22 (ARM64) - Android 14 - ビルド S901EXXSCEYB1 - Magisk で root 化

テスト済みアプリ

  • Whatsapp
  • Whatsapp Business
  • Signal
  • Telegram

主な課題と解決策

  1. ストリップされたシンボル
    • 問題: dlsym でシンボルを直接特定できません。
    • 解決策: 静的解析から得たオフセットを使用します。
  2. ビルド間でのシンボル/オフセットの違い
    • 問題: ストリップされたシンボルはビルドによって異なるため、直接 dlsym するのは失敗する可能性があります。
    • 解決策: テスト済みビルドにはベース + ハードコードされたオフセット(offsets.h)を使用し、Frida のシンボルダンプと IDA-PRO で検証します。
  3. モード検出の精度
    • 問題: VoIP セッション外での録音はノイズの多いデータになります。
    • 解決策: AudioFlinger::setMode(IN_COMMUNICATION) でフックをキャプチャし、遷移をログに記録し、グローバルモードフラグを保存します。
  4. SELinux
    • 問題: 一時ディレクトリへの書き込みや audioserver との IPC がブロックされる可能性があります。
    • 解決策: 必要なルールを追加する 「ポリシー注入」 ステップを提供し、テスト環境でのデバッグ用に SELinux 有効化/無効化 トグルを公開します。
  5. ファイルのライフサイクルと名前変更
    • 問題: スレッド停止時に不完全または破損した出力を避ける必要があります。
    • 解決策: 最初に .tmp に書き込み、stop() で .ac(ダウンリンク)または .bc(アップリンク)に名前を変更します。

参考(オープンソース & ドキュメント)

  • Dobby (インラインフッキングフレームワーク) - https://www.github.com/jmpews/Dobby
  • AndKittyInjector (Android プロセスインジェクター) - https://github.com/MJx0/AndKittyInjector
  • AOSP
    • frameworks/av/services/audioflinger (AudioFlinger, PlaybackThread, RecordThread)
    • system/media/audio (audio formats, attributes, channel masks)
ツールをダウンロード
/sdcard/voip
注
audioserver
関数目的
AudioFlinger::setModeIN_COMMUNICATION モード(VoIP アクティブ)への移行/からの移行を追跡します。
RecordTrack::getNextBufferマイク(アップリンク)音声フレームをキャプチャします。
PlaybackThread::Track::getNextBufferスピーカー(ダウンリンク)音声フレームをキャプチャします。
Track::stopダウンリンクファイルを閉じて確定します。
RecordTrack::stopアップリンクファイルを閉じて確定します。
  • RECORDTRACK_STOP_OFFSET
    • メソッド: android::AudioFlinger::RecordThread::RecordTrack::stop(void)
    • マングル名: _ZN7android12AudioFlinger12RecordThread11RecordTrack4stopEv
  • libaudioflinger.so に PLT フックがない
    • 問題: ターゲット関数(RecordTrack::getNextBuffer、Track::getNextBuffer など)は エクスポートされておらず、libaudioflinger.so にはそれらの PLT/GOT エントリがありません。
      • 標準の dlsym() や PLT ベースのフック機構は使用できませんでした。
    • 解決策: Dobby をインラインフックに使用しました。
      • フックは次の式を使用して実行時にインストールされます:
        root@kitploit:~
        target_addr = base_addr(libaudioflinger) + offset
        DobbyHook(target_addr, hook_fn, &orig_fn)