docs(kanade): 解析中間まとめ + PSB v6+ パーサと文字列抽出ツール

KANADE (Frontwing/KrkrZ) のセリフテキスト抽出に向けた一連の作業を記録。

達成:
- SteamStub DRM 剥がし、Goldberg Steam Emu 設置、PackinOne アンチタンパー
  パッチで起動シーケンスは大幅に進む状態に
- Frontwing 独自 PSB v6+ フォーマット (c1a2 magic + TLV tree) を解明、
  Python パーサ (tools/re/parse_psb_tree.py) を実装
- PSB 141 個を JSON 展開 → 全部 UI orchestration スクリプトで日本語ゼロ
  と確定

未解決:
- KANADE 起動: PackinOne の System.addFont 登録が KrkrZ の load order
  問題でブロック。XP3 内 TJS 改変も TJS パーサに弾かれて頓挫
- シナリオ所在: PSB ではなく Frontwing 独自スクランブル + KAG/TJS
  バイトコード化されている可能性大

次回の手掛かりは docs/instructions/kanade_progress.md にまとめた。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
tkgstrator
2026-05-09 07:08:51 +00:00
co-authored by Claude Opus 4.7
parent 7780e566d5
commit 222602248e
3 changed files with 444 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
# KANADE 解析: 進捗サマリ (2026-05-08 時点)
Frontwing 製 KrkrZ ベース ADV ゲーム「KANADE」(Steam App ID 3104270) の
セリフテキスト抽出を目的とした解析の中間まとめ。
## 達成項目
### 1. SteamStub DRM 剥がし
- ツール: `tools/steamless/` (Steamless v3.1.0.5、Mono 経由で実行)
- バリアント: SteamStub Variant 3.1 (x86)
- 結果: `KANADE.exe` (4,603,392 bytes、`.bind` 削除済 6 セクション)
- バックアップ: `KANADE.exe.bak` / `KANADE.exe.original` (元 4,789,712 bytes)
### 2. PE 整合性修正
- セクション名 `\xaa` 痕跡を `\x00` に正規化 (`.text` / `.data` / `.rsrc`)
- `.adata` セクション属性を CODE (0x60000020) → DATA-RO (0x40000040) に修正
### 3. Steam ライセンス回避
- `steam_api.dll` を **Goldberg gbe_fork** (`tools/gbe/`) の `regular/x32/` 版に置換
- `steam_api.dll.bak` に元 Valve 版を保存
- `steam_appid.txt` = `3104270`
- `steam_settings/configs.user.ini` で language=japanese, account_name=Player
### 4. KrkrZ 署名検証スキップ
- `KANADE.exe.sig` → `KANADE.exe.sig.bak` に退避
### 5. PackinOne.dll アンチタンパー突破
- バックアップ: `plugin/PackinOne.dll.bak`
- **Patch 1** (integrity check 強制成功):
- file offset `0x60300` (`sub_10060f00`) を 20 バイト書き換え
- 内容: `mov dword [0x1009f03c], 1; mov al, 1; ret; nop×7`
- 効果: SHA-256 ハッシュ check が常に PASS、`USER32.DLL` 無限ロード阻止
- **Patch 2** (addFont 登録 NULL crash 回避):
- file offset `0x33c61` を 10 バイト書き換え
- 内容: `eb 00 83 7f 08 00 75 3b 74 78` (NULL チェック分岐)
- 効果: `UFontEx::attach` が System dispatch=NULL のとき crash しない
- `plugin/PackinOne.dll.sig.bak` に元署名退避
### 6. PSB v6+ Frontwing 独自フォーマット解明
- `psbfile.dll` 自体には `c1 a2` パーサがなく、KANADE.exe 内蔵
- フォーマット: `\xc1\xa2\x06..\x09 \x00\x00\x00` ヘッダ + TLV (Type-Length-Value) tree
- タイプタグ:
| tag | 意味 | ペイロード |
|-----|------|-----------|
| `c1 6e` | MAP (string-keyed dict) | uint32 count + count×(raw_str_key + value) |
| `81 XX` | ARRAY | uint32 count + count×value |
| `02 XX` | STRING (UTF-16LE) | uint32 char_count + char_count×2 bytes |
| `00 XX` | NULL/scalar | uint32 value |
- Python 実装: `tools/re/parse_psb_tree.py`
- 一部ファイルは byte-level XOR スクランブルあり (H 値ファイル別)
### 7. PSB 141 個の網羅展開
- 全 PSB v6+ (data.xp3: 78個 + patch.xp3: 63個) を JSON 展開
- **日本語 (ひらがな + カタカナ) 出現は全 0 件**
- 内容はすべて UI orchestration (KrkrZ API call、asset 名、フォント設定等)
## 未解決の核心問題
### A. KANADE 起動失敗 (Whisky 上)
- **症状**: `PreRenderFontEx.AddTrueTypeFont: System.addFont not defined` ダイアログ
- **根本原因**: PackinOne.dll の `V2Link` 時点で TJS `System` クラスがまだ初期化されておらず、
`System.addFont` を生やせない (load order 問題)
- **試行と失敗**:
- 遅延実行パッチ案 → ユーザー判断で「意味ない」却下
- ディスク `startup.tjs` / `KANADE.tjs` 配置 → KrkrZ がディスクファイル読まない
- data.xp3 idx=1546 (PreRenderFontEx.tjs) を空 TJS で in-place 上書き → 様々な
エンコーディング (BOM 付き UTF-16LE / ASCII / CP932) を試したが全て Syntax error
- textrender.dll 退避 → 関係なし、`PreRenderFontEx` は textrender じゃなく
XP3 内 TJS スクリプトでクラス定義されている
### B. シナリオの所在不明
- PSB 141 個には日本語ゼロ
- 未分類 ~1000 件 (XP3 全件) でも UTF-16LE / CP932 で意味のある日本語連続文字列なし
- **仮説**: シナリオは Frontwing 独自スクランブル + KAG/TJS バイトコード化
- 実行時に KAGEX が復号 + 解釈
- 静的に文字列として検出できない設計
## ツール / リソース
| パス | 内容 |
|------|------|
| `tools/steamless/` | Steamless v3.1.0.5 (DRM 剥がし) |
| `tools/gbe/` | Goldberg gbe_fork (Steam Emu) |
| `tools/freemote/` | FreeMote v4.5.0 (標準 PSB のみ対応、KANADE は弾く) |
| `tools/re/parse_psb_tree.py` | KANADE PSB v6+ パーサ |
| `src/xp3/` | XP3 + Hxv4 + per-file XOR mask 復号 |
| `packages/frida/hook_kanade_packinone.js` | Frida スクリプト (起動できれば動く想定) |
| `docs/instructions/packinone_static_analysis.md` | PackinOne.dll 静的解析ノート |
| `docs/instructions/kanade_frida_setup.md` | Mac + Whisky + Frida セットアップ手順 |
| `targets/Kanade/run_kanade.sh` | Mac 用 wine64 直接起動スクリプト |
| `targets/Kanade/data.xp3.original` | クリーン data.xp3 バックアップ |
## 次回再開時の選択肢
1. **`extNagano.dll` 解析** — Frontwing 独自プラグイン、シナリオ読み込みの手掛かり
2. **KANADE.exe 内蔵 PSB パーサのリバース** — 実装拡張があれば見える
3. **TJS バイトコード仕様研究** — シナリオがバイトコード化されている前提
4. **CrossOver / Wine vanilla で起動再挑戦** — Whisky の load order 問題が解消する可能性
5. **Frida 動的解析** — Wine 起動さえ通れば、メモリから復号後文字列を直接読める
## ファイル状態 (2026-05-08 時点)
`targets/Kanade/` 配下の改変ファイル:
- `KANADE.exe` (DRM 剥がし版、4.6MB)
- `KANADE.exe.bak` / `.original` (元、4.8MB)
- `KANADE.exe.sig.bak` (元署名)
- `steam_api.dll` (Goldberg、9MB) / `.bak` (Valve、266KB)
- `steam_appid.txt`, `steam_settings/configs.user.ini`
- `data.xp3` (= `.original` から復元、md5 一致確認済)
- `data.xp3.original` (バックアップ)
- `plugin/PackinOne.dll` (パッチ済) / `.bak` (元)
- `plugin/PackinOne.dll.sig.bak` (元署名)
- `plugin/textrender.dll.disabled` (退避中、戻すには `.disabled` を消す)
- `startup.tjs`, `KANADE.tjs` (試行錯誤の残骸、削除可)