总之花了1个几个晚上 很快乐

(不会提到该游戏是什么,只会提到无关的游戏。但如果你碰巧也干了,你就肯定会知道是哪个游戏,iykyk.)

原因是有首翻唱曲只有游戏里有。

路径依赖

(说到路径依赖,我最近 Typst 用多了,刚才打出了 == 而不是 ##。哈哈。)

  1. 我有个 Root 过的 Android, 这不易如反掌,如入无人之境,盛必击而破之!
  2. 下载 安装 启动 点两下 下载要听的歌 退出
  3. 搜索游戏名称+解包。
  4. 一篇前人写的文章为我指路,我发现所有的文件其实都在 Android 文件夹下,不需要 Root.
  5. 总之拷贝到电脑上。
  6. 用 AssetStudio 打开,找到了许多好玩的图片,和室友一起看了半小时图。
  7. 发觉里面没有视频,放弃之。删了所有文件。
  8. 指路文指出,有些文件并不是 Unity 的文件,AssetStudio 是打不开的。于是重新从手机拷贝了一遍。
  9. 找了个 Hex Editor, 然后让 GPT-4o (via duck.ai) 写了个分类的脚本。
  10. 按文件大小排序(我真是个天才)然后一个一个拖进 VGMToolbox 看看能不能打开。
  11. 找到了好多 .usm 抽卡动画!不过提取的音频文件没有声音,不知道为什么。
  12. 放弃之。痛定思痛,文件留在手机里没删。

总结:路径依赖。不好。

开源

这里的开源是指“感谢马斯克开源”和“扔 GitHub 上”的某种混合,并不是指真的开源精神啥的。

  1. 找到了有人在 GitHub 上写的资讯站!然而点进去发现没有任何音频相关的东西。
  2. 看 commit 记录有个自动化脚本,是 GitHub Actions?
  3. 点进 profile 发现作者写了个全自动的程序!喜出望外。
  4. 定睛一看没有填密钥的地方,而 .gitignore 似乎包含了常见的密钥储存位置。山穷水尽?
  5. 总之跑一下吧!发现原来是模拟第一次安装游戏的,所以不需要密钥 bootstrap。还去 Google Play 查最新版本。太狠了。
  6. 跑到一半,把 GitHub Codespaces 的 20GB 空间占满了。放弃之,删了 Codespace.
  7. 犹豫要不要挂个 S3 Bucket 或者开个 VPS.
  8. 其实有下载和解密两步,而下载的文件解密完了才会删。
  9. 粗略确认下载完的加密文件是不需要的,那可不可以一边解密一边删原来的?
  10. 虽然不会写那个语言,但加两三行代码就行了。感谢 Copilot.
  11. 怕不保险,又把 Codespaces 里自带的 Python, nvm, Java 啥的删了。也不知道有没有起作用,反正最后控制在了 19GB.
  12. 又跑了一次,成了!居然还把该解密的都解密了,感恩。
  13. 好像一共有7位数还是8位数个文件?总之太多了。写了个脚本根据后缀分类。 仔细想了想,反应过来 ls 显示的是大小。虽然文件很多,但其实 VSCode 是能处理得过来的。分类只是为了方便找。
  14. 然后用 GPT-4o-mini 教我怎么用 find, 然后把文件移出来。
  15. 根据文件列表下载了需要的文件。

Codespaces 的套餐给的是每个月 20 GB, 算上别的肯定超了。所以得删掉一些东西。或许应该删视频?

总结:Codespaces 还是好用的。

逮虾户

(是 Déjà vu 的意思。)

  1. 下载了需要的 .acb 文件。
  2. 等等,怎么感觉似曾相识?原来是以前捣鼓过 libcgss. 忘记具体捣鼓啥了,反正读过音频那一部分。
  3. 坏消息——即使游戏的其他部分都解密了,音频仍然被 CriWare 提供的软件加密了。没有密钥。
  4. 用 libcgss 运行,.acb 文件变成了 .hca 文件。但是仍然是加密的。
  5. 搜游戏名+“acb”, 游戏名+密钥等,结果是理所当然地没有。
  6. 倒是找到了这篇文章,里面提到了有人逆向MLTD提取 HCA 密钥。方法是 MITM CriWare 的库。
  7. 这可难办了——我不想装 Android Studio, 我也没有 Android 8. 也不知道这几年有没有更新。
  8. 搜 “HCA デコードキー”, 找到了这个文件, 列举了一些已知的 key.
  9. 虽然这些 key 有2个参数,但 libcgss (还是另外一个随便找到库?) 需要3个参数。2显然不等于3.
  10. 抱着死马当活马医的心态,下载,运行。
  11. 好了。文件夹里出现了一个 .wav 文件。就是这么突然。

总结:柳暗花明。

月(半夜)锅

题外话——月锅是指一首叫做《MOON NIGHTのせいにして》的歌曲。翻译成月锅真是信达雅。

所以按大小排序其实没有用——因为 .acb 文件其实非常小。3MB. 连我最后产生的 .flac 都有 14MB.

音频为什么那么小呢?打开软件看了一眼波形和频谱,好像没什么特别的。就当是是 CriWare 黑科技了。

以及为什么 vgmstream 能用?不是需要密钥吗?vgmstream 说 .acb 文件 “may” (可能) 加密了,所以也许是我多虑了。

写到这里,我想起来《指路文》里说,音频是没加密的。也许是我潜意识里没觉得 CriWare 能有不加密的文件。

写到这里,我又想起来看到的这篇文章说:

假如我的手上有两份最终波形完全相同的hca,但是其中一个是ciph 0(无加密),另一个是ciph 56(密钥加密),如何处理这个ciph 56的版本呢?

首先,这个研究的起源就是chunithm。21年的大型leak之后,chuni new最终还是给自己的cri套件加上了密码。

那应该就是 ciph 0 了,vgmstream 的输出也没提到有加密。

总结:也许说明不应该半夜干活,导致看见的东西没进脑子。

不过音乐是拿到了,可喜可贺。

老办法

拿到音乐了,封面图怎么办?

  1. 根据歌曲 ID 查找对应的 Unity asset.
  2. 找到了,下载之。顺便下回了 AssetStudio, 虽然下回来的好像不太一样。
  3. 提取之,结果发现像素不够,好糊。
  4. 那字幕组是这么拿到图片的?声音可以内录,总不至于截(有边框的)图然后修图吧。
  5. 想起来了有推特这个东西,于是打开推特,熟练地把 URL 改成 4096x4096. 一气呵成。

总结:还是路径依赖?

版本悲伤

  1. AssetStudio 停止维护了,到处找能用的分支。
  2. 到处找 Hex Editor, 最后找到了 ImHex. 字体好难看,赶紧调成 Fira Code.

最后下载的的软件如下:

  • AssetStudio, 虽然最后没用上。以后也许有用。
  • VGMToolbox, 虽然已经不维护了。虽然叫 VGM 但其实最大的用处是提取 .usm 视频。
  • vgmstream. 好用,爱用。甚至有 Scoop 收录。(虽然我知道收录门槛也没那么高。)

以及这篇文章里的链接可能以后会有用。

总结:今天有好多次从 GitHub releases 下载 .exe 然后运行,甚至包括一次没源码的仓库。(作者说源码在另一个仓库,但是没点进去看。)

除了被 Windows 的 UAC 保护了意外,还有就是我运气好吧。下次一定搞个沙盒。

还有高手

原来 .acb 是分 subsong 的,一个文件可以塞好多句话。

而年少无知的我因为空间不够把文件全删了,导致第二天重新来过。

解决方法是在 vgmstream-cli 加上 -S 0 表示你想要所有的 subsongs.

然后跑到这里又爆 20GB 了,思来想去还是转向 WSL2 (不是很想留着 Go 的碎文件,希望用内存缓冲一下).

评论:早干嘛去了?

WSL2

(后文以 WSL 指代。)

  1. 之前有个设置好的 WSL, 甚至能用 Windows Hello 验证 sudo, 打算复制一份用。
  2. 先导出,命令是 wsl --export Debian debian.tar. 还挺小,只有 569 MB.
  3. 然后找个文件夹放 .vhdx 磁盘文件
  4. 然后导入: wsl --import debian-new C:\example\debian-new debian.tar
  5. 最后发现登录进去默认是 root 用户, 更改方法是修改 /etc/wsl.conf.

然后就是 VSCode 时间:

  1. 去扩展商店下载 WSL 插件.
  2. Command Palette… 里点 WSL: Connect to WSL using Distro…
  3. 然后就好了。真神奇。

本来不打算用 Git, 因为懒得在新机器上设置 Git; 但是 VSCode 其实做了一些魔法,自动帮你登陆 GitHub, 我也不知道是怎么做到的。

总之如果你已经在目录里了,那么如何挽救:

  1. git init
  2. 如果 branch 和 remote 不一致,比如叫 master, 就改掉: git branch -m main
  3. git remote add origin https://github.com/example/example
  4. git fetch origin
  5. git reset --hard origin/main (别怕,如果和 remote 一样那么文件不会变动)
  6. git branch --set-upstream-to=origin/main main
  7. git pull 确认 Already up to date.

至于代码,因为遇到了网络问题(难免),于是让 Copilot 改了改需要改的地方,四舍五入我也会 Go 了。

要是有时间就把代码改成模块化的吧。

(不是指围棋。)

(也不是指 BanG Dream! MyGO!!!!! ——例句:“还在go”)

鞠躬尽瘁

某个网站列举了角色卡面的所有语音文本。

  1. 先是搜索引擎搜索,没有别的结果。
  2. 然后在解包的文件里找了半天,连 UnityFS 里的各种 script 都不放过。结果是找不到。
  3. 那这个文本到底是哪里来的呢?GitHub 上其他的查卡器上也没有语音文本,只有技能说明。
  4. 去看了一眼其他角色的页面,果然——有空缺的卡。
  5. 果然是自己听写的,真是鞠躬尽瘁。仔细看了看也感觉没有任何差错。

所以呢

总结一下我获得的许多东西:

  • 剧本(以及少量的舞台指示)。
    • 用 Edit with Copilot 写了个查看器。
    • 其实有人写过了,见到过截图。但网上就是找不到。
  • 一些游戏里才有的音乐,比如翻唱。
  • 卡面,虽然懒得提取。
  • 视频,虽然嫌空间占用大而删掉了。
  • 一些关于 Go 和 WSL 和 CriWare 的大概再也用不到的知识。
  • 音频,可以用来活字印刷?虽然没有点子。
    • 我不太能接受 “AI配音”,因为没什么用,效果不好,影响也不好。输输输。
    • 活字印刷 (人力/音MAD) 倒还在接受范围内。
  • 这篇文章。本来就是想记录一下踩的坑,结果越写越长。

以及失去的许多东西:

  • 两三个下午,晚上和深夜。
  • 大概 10GB 的硬盘空间。

不过总体还是挺开心的,成就感满满。