ClaudeDocs/OVERVIEW.md

Hololive Dreams 資源逆向工程完整報告

目標game.qualiarts.hololive.dreams(國際版)— 逆向 octo (Sonet OctoCache) 資源系統的加密, 建立通用解密工具,完整取出音效、影片、Live2D 模型與角色美術。

平台:越獄 iPhone X (iOS, Sileo/OpenSSH) + macOS (Apple Silicon) 引擎:Unity 6000.3.0b1,IL2CPP,metadata v39

本文為統整報告。逐步踩坑紀錄另見 RE_NOTES.md(音效/影片)、RE_NOTES_LIVE2D.md(Live2D)、 演算法數學式見 ALGORITHM_MATH.md,工具見 hddunpack/


0. 成果總覽

類型 數量 格式 目錄
Live2D 角色貼圖 atlas 80 4096×4096 PNG all_live2d_atlas/
Live2D moc3 模型 4 .moc3 v5 live2d_models/
角色全身立繪 19 4096×4096 PNG character_art/
音效 1240 WAV converted/audio_wav/
影片 120 MP4 converted/video_mp4/

(angka受限於「已在遊戲內觸發下載」的資源;未下載的 catalog 項目觸發後可用同工具解出。)


1. 取得資源

2. IL2CPP Method Map(逆向的地基)

3. 加密演算法(核心)

公開版說明:本節原本載有完整、可直接實作的虛擬碼(填充順序、雜湊種子、 白化步驟),已於此公開版移除。 保留下面的形狀描述與 §3.1 的過程紀錄。 移除的理由與判斷依據見根目錄 README.md

需要說明的是,這裡不存在「拿掉金鑰、留下演算法」這種切法:金鑰是從 資產名推導出來的,推導程序本身就是金鑰。原始文件裡唯一的魔術常數是一個 單一位元組的雜湊種子——在已知明文就寫在檔頭的情況下,256 種可能是 微秒級的窮舉。只遮那個常數等於什麼都沒遮,所以整段一起移除。

反編譯目標:Vision.Octo.ResourceDecrypter.DecryptHeader

可以說的形狀:

資源 前綴 XOR 起點 address 來源
CRI 音效/影片 QUAVMAGIC(9B 明文) byte 9 原始檔名
AssetBundle byte 0 catalog 資產名

3.1 一段關於「以為是兩套加密」的誠實紀錄

最初只看表面(bundle 無 QUAVMAGIC、開頭高熵)就過早斷定是不同機制,繞了很大一圈 (試過 LZ4、AES、GPU hook、Metal capture…)。真正的突破是回到基本功做已知明文攻擊

教訓:表面特徵不同 ≠ 演算法不同。該先做已知明文分析再下結論。

4. octo 資源目錄 (catalog)

5. 各資源類型的抽取

音效/影片

Live2D

角色美術

6. 通用工具 hddunpack/

sssekai 風格的 CLI + library:

python -m hddunpack catalog-parse  catalog_region.bin -o catalog.json
python -m hddunpack unpack-octo    octo/v1 --catalog catalog.json -o out/ --filter live2d_mdl
python -m hddunpack decrypt-bundle <file> --address live2d_mdl_00019-nrml-0016-00 -o out.bundle

模組:crypto(金鑰/解密)、catalog(目錄解析)、extract(UnityPy 抽取)。

7. 尚未完成 / 後續

附錄:關鍵位址(UnityFramework, Unity 6000.3.0b1)

# 加密
Vision.Octo.ResourceDecrypter.DecryptHeader   0x0B449AAC
  KDF 包裝                                     0x0B449F9C
  填充+雜湊+白化                                0x0B44B28C
# Live2D 原生 (Cubism Core, 匯出符號)
csmReviveMocInPlace                            (Module export)
# IL2CPP embedding API (本地符號表, 未匯出但存在)
il2cpp_domain_get / _get_assemblies            0x002d4e18 / 0x002d4e24
il2cpp_class_from_name                         0x002d48b4
il2cpp_runtime_invoke                          0x002d533c
# Unity
AssetBundle.LoadFromFile(Async)                0x09E0153C / 0x09E01228
ImageConversion.EncodeToPNG                    0x09F44568
Object.FindObjectsOfType(Type)                 0x09ED7AC8