バンドリ!ガールズバンドパーティ!(BanG Dream! 少女乐团派对)游戏资源/歌曲解包

解包 《バンドリ!ガールズバンドパーティ!》(即 BanG Dream! 梦想协奏曲 少女乐团派对,以下简称 garupa)游戏的资源文件。

其实这不是什么新东西,网上已经有很多相关的教程了,只是因为整个过程有点繁琐,所以写一篇新的文章记录一下过程和补充一些细节。

下文以 Android 版本的日服和国服为例。以下内容仅供学习使用,请勿用于商业等用途。

综述

Garupa 的主要资源文件(包括音乐、贴图、Live2D模型、语音、卡牌、BGM……)都存放在 /storage/emuated/0/Android/data/jp.co.craftegg.band/data/files 下(简体中文版的包名为:com.bilibili.star.bili),在这个文件夹下你可以看到一堆文件名为一串哈希值的无后缀文件,这些文件是压缩后的 Unity Asset Bundle 文件。

将这些压缩后的 bundle 文件展开,可以看到游戏的数据文件。其中有一些例如 Live2D 模型、表情、贴图、卡牌等文件以 mtn, 图片等形式存储,它们可以直接导出;而大部分的音乐(原创音乐、翻唱音乐、试听音乐、BGM等)通过加密、压缩之后,以 acb 的形式存储在 Unity Asset Bundle 中。

所需工具

第一步:获取 garupa 资源文件

方法 1

直接提取已下载好的数据包:adb pull /storage/emulated/0/Android/data/jp.co.craftegg.band/data/files D:\bandori;如果是国服: adb pull /storage/emulated/0/Android/data/com.bilibili.star.bili/data/files D:\bandori

方法 2

首先从 https://d2ktlshvcuasnf.cloudfront.net/Release/3.2.0.500/Android/AssetBundleInfo 获取日服的 AssetBundleInfo 的资源列表文件。其中,3.2.0.500 是游戏数据的版本,这个可以在 bangdream.ga 数据库里查到,左侧有一个 Japan Server Data Ver 就是当前日服的资源版本。

下载得到的 AssetBundleInfo 长这样:

根据左边的文件路径找到你所需要的资源。这里就需要有一些技巧,例如要下载 Pastel*Palettes 的歌曲《きゅ〜まい*flower》,首先搜索 musicjacket(曲目封面)开头的内容,按照歌曲在游戏内上架时间和名称的关键字查找对应的 ID 项,如根据关键字和上架时间,定位到这首歌对应的是 musicjacket/186_myflower,说明这首歌的 ID 是 186,对应的资源文件是 sound/bgm186.

接下来下载,只需要将资源路径接到地址 https://d2ktlshvcuasnf.cloudfront.net/Release/3.2.0.500/Android/ 后面。例如要下载这首歌,资源文件的地址就是 https://d2ktlshvcuasnf.cloudfront.net/Release/3.2.0.500/Android/sound/bgm186 .

两种方法得到的文件都是压缩过的 Unity Assets Bundle 文件。

第二步:解压 Unity Assets Bundle 文件

对于第一步中使用方法二下载的单文件,可以直接使用 UABE 或者 AssetStudio 打开。这里我们使用 AssetStudio 打开上面下载得到的文件,直接左上角 File->Load File 即可:

如果使用 UABE,打开之后会提示资源已压缩,让你选择解压出来保存的文件。随便选择一个位置保存,然后点击 Info 就可以看到这个文件的内容。

打开后点击 Asset List 标签页。我们可以看到,这个 bundle 下有两个文件,其中我们感兴趣的是后缀为 .acb 的文件。这是一个 Unity 的 TextAsset 文件,实际上歌曲就以加密的形式存储在其中。我们将其右键选中,点击 “Export selected assets” 将其解压出来(如果是 UABE,选择右边的 Plugins/Export to .txt导出)。


上面是打开单文件的情况。对于下载好的数据包,里面的资源文件都是乱码,我们无法知道哪个 bundle 文件里面包含了什么内容。此时可以使用 AssetStudio 批量读取,点击左上角 File->Load Folder 选择上面获得的数据包文件夹(D:\bandori)即可。

然后你可以在 Asset List 页面中看到所有的信息。在 Filter 中通过关键字筛选(如筛选所有的 acb 文件),然后点击 Export->Filtered Assets 可以导出筛选的资源。

导出后的文件可能是 .acb 后缀的文件,或者 .acb.txt 格式的文件(如果你是从 Export 菜单里导出)。后者其实本质上就是 .acb 文件,可以批量将其后缀改成 .acb:

ren *.acb.txt *.acb

此外还有一些额外你可能会感兴趣的内容,例如游戏内的 Live BGM,bushimo/craftegg 语音, 抽卡 BGM 等等,它们位于 apk 安装包的 assets 下。

第三步:解压、解密 acb 文件得到声音文件

这一步我们有两种方案。第一种是直接使用 acbDecrypter,第二种方法是使用 vgmtoolbox 将 ACB 转换为 HCA,再使用 HCADecoder 将 HCA 解密。

方法一:使用 acbDecrypter

首先解压 acbDecrypter,这里解压需要一些技巧:因为该程序的部分文件名是日文,如果直接解压可能会导致文件名乱码,影响程序的运行。为此我们需要先设置解压程序的编码,以 BandiZip 为例,在 选项->设置中,将“默认代码页”改为“日语”(弄完之后记得改回去嗷):

为了后面操作的方便,这里建议将解压后的目录添加到系统的 PATH 环境变量中,这一步就不多说了。

接下来将我们解包的 ACB 放到一个目录中(如放在 D:\test\bgm186.acb 下),在该路径下打开命令提示符,然后输入:

chcp 932

这一步先修改 cmd 的编码为 932(日文 ShiftJIS);然后输入:

acbdecrypter

CMD 中会提示:“フォルダを選択?[y/N]”(选择文件夹?),我们输入 y 并选择当前文件夹;

接下来会提示 “HCAファイルが見つかりました。鍵を選択してください。”(已找到 HCA 文件,请选择解密使用的密钥),并弹出一个窗口让你选择游戏资源对应游戏的密钥:

WTF,弹出来的选择窗口除了几个带英文的都是乱码,根本不知道应该选哪个。此时我们找到 acbdecrypter 目录下的 hcaToWav 目录,在这里有一个 “復号鍵リスト.txt” 文件,里面存储的就是这个界面中列出密钥。我们使用 ShiftJIS 编码打开该文件,可以看到以下内容:

CF222F1FE0748978 : デフォルト鍵
CC55463930DBE1AB : ファンタシースターオンライン2
0000000077EDF21C : ロウきゅーぶ! ひみつのおとしもの
0000000049913556 : ロウきゅーぶ! ないしょのシャッターチャンス
00000000012C9A53 : ジョジョの奇妙な冒険 オールスターバトル
00003657F27E3B22 : アイドルマスター シンデレラガールズ スターライトステージ
00003657F27E3B22 : シャドウバース ※未確認
0011DCDD0DC57F48 : グリモア~私立グリモワール魔法学園~
0000000000003039 : Fate/Grand Order (初期アセットのみ)
7E89631892EBF464 : Fate/Grand Order (ダウンロード完了後の音声データはこっち) ※未確認
FDAE531AAB414BA1 : Tokyo 7th シスターズ ※未確認
00000000001D149A : ONE PIECE DANCE BATTLE (ダンバト)
0000000000000978 : アイドルコネクト
00000000012EBCCA : ダービースタリオンマスターズ
0000000002B99F1A : ららマジ
00000000000022CE : バンドリ! ガールズバンドパーティ!

可以看到这里给出了一些常见日游的解密密钥,我们想要的 《バンドリ! ガールズバンドパーティ!》 密钥是 00000000000022CE,因此在上面的界面中,我们选择最后一项(其实这一步,将系统的非 Unicode 程序默认语言改成日语也可以正常显示,但是后面要恢复回去),并点击“决定”,此时程序就会自动开始解密:

当看到 “全て完了しました。”(全部完成了)的提示、并且没有报错的时候,表明资源已经成功解压。此时会自动打开一个后缀为 _decrypted 的文件夹,在里面会找到 .wav 格式的文件,这就是我们所需要的 wav 声音文件了:

方法二:使用 vgmtoolbox + HCADecoder

首先打开 vgmtoolbox,依次展开左侧的 Misc.Tools -> Extraction Tools -> Common Archives -> CRI ACB/AWB Archive Extractor,然后将 acb 文件拖进右边的空白处:

接下来在 acb 所在目录下会生成一个 _vgmt_acb_ext_filename 的文件夹,依次展开会得到一个 HCA 文件。

接下来解密这个 HCA 文件,将这个 hca 文件复制到 HCADecoder 的目录并在该目录下打开 cmd(或者直接将 HCADecoder 所在目录加入到 PATH 变量中,并在当前目录打开 cmd)。

这里我们先对 HCADecoder 这个脚本做一下修改,先将 “オプション指定デコード.bat” 改一个好调用一点的名字,例如 “start.bat”。然后使用 ShiftJIS 编码编辑该文件,在第 16 行左右的位置将 set X_K= 改为 set X_K=00000000000022CE,填入 garupa 的密钥(其它密钥可以在该目录下的 “復号鍵リスト.txt” 找到)。

然后我们直接运行:

chcp 932
start.bat bgm186.hca

一路回车就可以得到 wav 文件。

细节

使用 AssetStudio 提取的翻唱曲的解密

如果直接从已下载的数据包中提取 acb,会发现部分 acb 文件是分为多个 100K 文件存储的:

对照部分 ID 表我们发现这些分文件存储的 acb 大部分都是翻唱曲。并且如果你使用 acbdecrypter 直接解密这个文件,会得到全损音质的 wav. 其实解密这些文件也很简单,只需要将文件从头到尾拼起来就好了,就是简单的循环+文件读取写入。以下是一个示例程序(为了展示它到底有多简单,这是一个 PHP 程序):

<?php
$content = '';
for ($i = 1; $i <= 33; $i++) {          // '33' 是分文件的个数
    $filename = sprintf("Bgm008-%03d.acb", $i);
    $file = file_get_contents($filename);
    $content .= $file;
}
file_put_contents('bgm-008.acb', $content);

然后再使用第三步的方法解包就可以了。

提取解密 ACB 的密钥的方法

关于这个,在 HCADecoder 程序的仓库中有一个 ‘復号鍵の探し方/メモ.txt` 的文件,作者在里面介绍了提取的一种方法。不过因为我太菜看不懂日语,所以如果各位有兴趣的话直接看该文件就可以。

参考文章