mirror of
https://github.com/qtmleap/revkit.git
synced 2026-09-14 07:11:50 +02:00
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.3 KiB
3.3 KiB
Work Plan: 48B HMAC 鍵と DH Public Key TFIT エンコードの調査
Date: 2026-04-09
Goal
- 48B HMAC 鍵の生成メカニズムを特定する
- DH 公開鍵 → key 33.6 (352B/144B) の TFIT エンコード方法を解明する
Tasks
Reverse Engineer (静的解析)
- 1. radare2 で
nflxDhDerive(0x0feec) を逆アセンブリし、HMAC 呼び出しへの 48B 鍵の流れを特定 - 2. Ghidra headless で
nflxDhDeriveをデコンパイルし、SHA384 → 48B 鍵の入力を特定 - 3.
genModelGroupKeys(0x1db74) をデコンパイルし、TFIT テーブル選択と DH 公開鍵エンコードロジックを解明 - 4. NFWebCrypto のデータセグメントで TFIT テーブル候補 (4KB+ 中エントロピー領域) をスキャン
Frida Engineer (動的解析)
- 5.
HMAC_Init_exにスタックトレース付きフックを追加し、48B 鍵設定時のコールチェーンを取得 - 6.
EVP_KDF_derive/EVP_PKEY_deriveをフックし、DH 後に KDF が呼ばれるか確認 - 7. DH_compute_key 出力バッファからの memcpy/memmove をトレースし、48B 鍵バッファへの書き込みを追跡
Tweak Engineer (動的解析)
- 8. SHA384 (one-shot) フックを追加 — 48B 鍵が SHA384 出力なら入力データを特定
- 9.
_TFIT_wbaes_ecb_encrypt_iAES11シンボルをフックし、key 33.6 構築時の TFIT ECB 暗号化を追跡
Python Engineer (エミュレーション)
- 10. Unicorn Engine で NFWebCrypto の TFIT 関数を ARM64 エミュレートし、DH 公開鍵 → key 33.6 変換を再現
- 11. 48B 鍵の導出が判明したら
derive_initial_session_keys()を更新し、Tweak/Frida 非依存にする
Execution Order
- 並列 — 静的解析 + 動的解析
- RE: タスク 1-4 (Ghidra/r2 で関数解析)
- Frida: タスク 5-7 (スタックトレース + KDF フック)
- Tweak: タスク 8-9 (SHA384 + TFIT フック追加)
- 順次 — 相関分析
- 静的解析で特定した関数アドレスと動的解析のログを照合
- 順次 — エミュレーション
- タスク 10-11 (判明したアルゴリズムを Unicorn + Python で再現)
Deliverables
docs/spec/msl_48b_key_derivation.md: 48B 鍵の導出アルゴリズム文書tools/re/analyze_nflxDhDerive.py: r2pipe による nflxDhDerive 解析スクリプトtools/emulate_tfit.py: Unicorn による TFIT エミュレーションsrc/netflix_msl/crypto.py: 更新版 (48B 鍵自力導出)
Key Hypothesis (静的解析から)
RE エージェントの予備調査により:
- 48B 鍵 = SHA384(AppleNativeKey.getBytes()) — DH コンテキストの
+0x28オフセットに格納された鍵オブジェクトの SHA384 ハッシュ nflxDhDerive(0x0feec) 内の 0x10174 でSHA384が呼ばれ、その出力が 0x101a0 のHMACに渡されるgenModelGroupKeys(0x1db74) が TFIT テーブル (_TFIT_key_iAES11_mgkiPhone) を使用して DH 公開鍵をエンコード
Risks / Notes
nflxDhDeriveのアドレスは静的解析の推定であり、ASLR で実行時にずれる- Unicorn エミュレーションは Mach-O ロード + リロケーション処理が必要
- TFIT テーブルがバイナリバージョンに依存するため、バージョン 15.48.1 固有の結果になる