Files
tkgstratorandClaude Opus 4.7 3b28789bff docs(znca): whitebox/CFF/anti-debug/self-kill/gen_audio_h 深堀と旧結論の訂正
`+[VoIPClient initGenAudioH]` と `_gen_audio_h` の内部構造を並列 5 系統
で追加解析。旧 `znca_ios_init_gen_audio_h_static.md` の主要結論が複数覆さ
れたので、脚注ベースで訂正しつつ 6 本の新規 spec ドキュメントに事実関係を
移した。

## 訂正された旧結論

- `0x101034204` は CFF dispatch 変数ではなく write-only decoy sink
  (629 writes / 0 reads)。真の CFF state は 693 個の private stack slot、
  9 zone-base regs (x8/x12/x13/x14/x15/x19/x20/x22/x25/x26/x28) 経由
- 「CFF 694 dispatch site」のうち functional edge はわずか 15、残り 678 は
  opaque predicate による no-op (99.7% がダミー)
- 生 SVC 分類: sysctl×12 → sysctl×10 + getpid×4
  (`mov w8,#0x14 → mov w16,w8` の register-forward で拾えていなかった)
- `kill()` × 3 は全て sig=0 の良性 liveness probe、self-terminate では
  なかった (SVC 直前の `str wzr,[slot]` + dynamic emulation で確認)
- `sysctl` の MIB は 9/10 で `[CTL_KERN=1, KERN_PROC=14, KERN_PROC_PID=1,
  pid]` に確定 (`kinfo_proc` P_TRACED パターン)
- 旧 doc の brk 2 発 (`0x1007d98b0`, `0x1007d9a68`) は initGenAudioH に属
  さず、無関係な `0x1007d94d0`–`0x1007d9bd0` に属する
- 「Frida hook 時の 500 回再帰 objc_msgSend」は静的に不可能と判明
  (`objc_msgSend$initGenAudioH` stub は caller が 1 箇所のみ、selref も 1
  箇所のみ)。旧 doc の crash 記述の `Crew@0x7D5B4` は `Crew@0x7D5F4`
  (initGenAudioH コールサイトのリターン IP) の転記ミスの可能性大
- whitebox blob (2.13 MiB @ 0x100f70000..0x101192000) の内訳:
  1.76 MiB (82.6%) pure table + 380 KiB (17.4%) CFF plumbing (31 islands,
  2775 chained-fixup pointer)
- Chow-style AES 仮説は refute: 生 S-box (`63 7c 77 7b`) は blob 全域全
  alignment で 0 hit、`_gen_audio_h` の register-indexed LDRB も 0
  (SIMD `ldr q0` が 8 発のみ)
- `_gen_audio_h` の 8 個 SIMD load は 6/8 が自関数の 283,520 バイトのスタッ
  クフレーム (`x19`) を読んでおり、whitebox blob を直接 index していない。
  9-subtable 仮説の SIMD 経路は refute
- `_set_platform_for_gen_audio` は x0 を読まず self-contained、可変
  platform id は渡していない
- `_gen_audio_h` は CryptoPP SHA-256 (K[64]) を直接呼ばず、`_CC_SHA256`
  stub も未使用

## 新規 spec ドキュメント

- `docs/spec/znca_ios_whitebox_layout.md`: blob の pure/plumbing split、
  entropy/pointer-fixup 解析
- `docs/spec/znca_ios_init_gen_audio_h_cff.md`: CFF de-flatten 結果
  (dispatch idiom `target = base + state`、functional edge 15/694)
- `docs/spec/znca_ios_antidebug_strings.md`: SVC 35 全分類、MIB/signal
  確定、runtime string decoder は 425M+ emulate でも未到達
- `docs/spec/znca_ios_true_selfkill.md`: 空振り報告 + 旧 crash 観測の
  転記ミス仮説
- `docs/spec/znca_ios_gen_audio_h_internals.md`: 8 SIMD load 追跡、
  9-subtable 仮説の refute
- `docs/spec/znca_ios_init_gen_audio_h_static.md`: 上記に沿ってピンポ
  イント訂正パッチ (400→441 行、Edit のみ)

## 未解決 (追跡不可で正直に残置)

- 難読化 anti-debug 比較文字列の runtime decoder 位置と平文値
- 真の self-kill 経路 (存在するかも含めて要実機再現)
- 2 個の pointer-indirect SIMD base の pointee provenance
- `_gen_audio_h` の 277 KiB stack scratch zone の populate 経路
- 間接 crypto call path があるか

## 補助生成物

- `targets/znca_ios_3.4.1/whitebox/tools/*.py`: 前セッションで消失した
  npy 生成コードを LIEF ベースで復元
- `targets/znca_ios_3.4.1/analysis/{cff,antidebug,selfkill,gen_audio_h}/
  *.py`: capstone/lief/emulator ベースの解析スクリプト群
- CFG dot ファイル: `analysis/cff/cfg_full.dot` + 11 zone 別
- 中間 npy/output: `whitebox/analysis/*.npy`,
  `analysis/gen_audio_h/*_output.txt`

## 除外

Nintendo バイナリ (Crew / GameWidgetsExtension / NotificationService /
whitebox_data_*.bin) と Frida ランタイムログはコミット対象外。pickle
キャッシュ (`insns.pkl`, `cfg.pkl`) はスクリプトから再生成可能なので除外。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-03 10:53:06 +00:00
..

revkit

English

iOS / Android アプリのリバースエンジニアリングツールキット。

  • iOS Tweak 開発 — Theos/Orion による Substrate Tweak のビルド・デプロイ (arm64, rootless)
  • Frida フック — iOS / Android アプリのランタイム解析・動的インストルメンテーション
  • mitmproxy — HTTPS トラフィックキャプチャ・プロトコルデコード
  • バイナリ解析 — Ghidra, radare2, jadx, ipsw による APK / IPA の静的解析

構成

.
├── packages/
│   ├── frida/                  # Frida フックスクリプト (TypeScript → JS)
│   │   └── src/
│   │       ├── ios/            #   iOS 用フック (ObjC/C++)
│   │       ├── android/        #   Android 用フック (Java/JNI)
│   │       └── common/         #   共通ユーティリティ
│   ├── mitmproxy/              # mitmproxy アドオン
│   └── tweak/                  # iOS Tweak (Theos/Orion)
│
├── tools/                      # Python ユーティリティ
│   ├── run.py                  #   Frida フック実行ランナー
│   ├── transformers/           #   ログ変換 (Frida → 統一フォーマット)
│   └── ...
│
├── handlers/                   # Objection ハンドラ (CommonCrypto, Security 等)
├── docs/                       # 解析結果・仕様書
├── assets/                     # IPA/APK バイナリ (.gitignore)
├── raws/                       # Frida 生キャプチャログ (.gitignore)
└── logs/                       # 変換済みログ (.gitignore)

開発環境

DevContainer で構築済み。Rebuild Container で全ツールが揃う。

ランタイム

ツール 用途
Python 3.12 (uv) ユーティリティ、ログ変換、解析スクリプト
Node.js 25.x Frida スクリプトのビルド (frida-compile)
Bun Chrome 拡張のビルド
Frida 17.x 動的インストルメンテーション
mitmproxy プログラマブル HTTPS プロキシ

リバースエンジニアリング

ツール 用途
radare2 ARM64 逆アセンブル・バイナリ解析
Ghidra (headless) 擬似コード生成・関数解析
jadx Android APK → Java 逆コンパイル
apktool Android APK リソース展開・smali
ipsw iOS Mach-O 解析・ObjC/Swift クラスダンプ
lief (Python) Mach-O/ELF バイナリパーサー
capstone (Python) ARM64 ディスアセンブラ
unicorn (Python) CPU エミュレーション
pywidevine (Python) Widevine DRM 解析

iOS Tweak 開発

ツール 用途
Theos Tweak ビルドシステム
Orion Swift Tweak フレームワーク
Swift 5.8 (cross-compile) iOS 向けクロスコンパイル
iOS SDK 15.6 / 16.5 ビルドターゲット

macOS ホスト設定

DevContainer は Docker Desktop の Linux VM 内で動作するため、iOS デバイスと直接通信できない。USB 接続の iproxy を経由することで、WiFi の IP 変更やネットワーク不安定の影響を受けずに接続できる。

1. iproxy のインストール (macOS)

brew install libimobiledevice

2. iproxy の起動 (macOS)

iPhone を USB で接続した状態で:

iproxy 2222 22 &
iproxy 27042 27042 &
  • 2222 → 22: SSH 接続用
  • 27042 → 27042: Frida 接続用

接続経路

用途 方向 経路
SSH コンテナ → デバイス ssh iPhone → host.docker.internal:2222 → iproxy (USB) → デバイス:22
Frida コンテナ → デバイス frida -H host.docker.internal → iproxy (USB) → デバイス:27042
mitmproxy デバイス → コンテナ デバイスの WiFi プロキシを macOS の LAN IP:9080 に設定

使い方

Frida フック

# iOS (objection 経由で spawn)
uv run python tools/run.py packages/frida/<script>.js

# Android (spawn モード)
uv run python tools/run.py --android packages/frida/<script>.js

.env にデバイスのホストを設定 (iproxy 経由の場合は host.docker.internal):

IOS_HOST=host.docker.internal
ANDROID_HOST=192.168.x.x

mitmproxy

デバイス側の設定

  1. デバイスの WiFi プロキシを macOS の LAN IP、ポート 9080 に設定
  2. デバイスのブラウザで http://mitm.it にアクセスし、CA 証明書をインストール
    • iOS: 設定 → 一般 → VPN とデバイス管理 → mitmproxy をインストール → 設定 → 一般 → 情報 → 証明書信頼設定 で有効化

起動

uv run mitmdump --listen-port 9080 --set block_global=false \
    -s packages/mitmproxy/<addon>.py

アドオンは packages/mitmproxy/ に配置。

iOS Tweak (Theos)

# ビルド
make -C packages/tweak/<tweak名>

# パッケージ (.deb 生成)
make -C packages/tweak/<tweak名> package

# デバイスへのインストール
make -C packages/tweak/<tweak名> package install THEOS_DEVICE_IP=<デバイスIP>

バイナリ解析

# iOS: ObjC/Swift クラスダンプ
ipsw macho info <binary> --class-dump

# Android: APK 逆コンパイル
jadx -d /tmp/out <apk>

# Ghidra ヘッドレス解析
analyzeHeadless /tmp/project name -import <binary>

Claude Code スキル

本プロジェクト固有のスラッシュコマンド。Claude Code 内で使用できる。

コマンド 説明
/compose Agent Teams のリーダーとしてチームを編成し、計画策定→承認→実行のワークフローを開始する

エージェント

/compose から呼び出される専門エージェント。

エージェント 担当
tweak-engineer iOS Tweak 開発 (Orion/Theos, ElleKit C フック)
frida-engineer Frida フックスクリプト、ランタイム解析
mitmproxy-engineer mitmproxy アドオン、トラフィックキャプチャ
python-engineer Python ユーティリティ、デコーダー、データ処理
log-monitor Frida/mitmproxy/Tweak のログ監視・レポート