Files
revkit/docs/instructions/kanade_progress.md
T
tkgstratorandClaude Opus 4.7 222602248e 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>
2026-05-09 07:08:51 +00:00

115 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` (試行錯誤の残骸、削除可)