Switch游戏《超侦探事件簿 雾雨谜宫》UE4解包笔记

最近在玩《超侦探事件簿 雾雨谜宫》这款弹丸精神续作,里面的小死神的各种颜艺表情,让我想起之前的黑白熊非常的可爱。

在有着同样想法的群友怂恿下,开始了痛苦的初次解包之旅。
需要的工具我会放在文末跟参考文章链接一起,并在文章中用加以标注。

解包本体NSP获取NCA资源文件
首先拿到游戏的ROM,我是从Switch520上下载的nsp文件。随后是本次解包需要的prod.keys[注 1],当前最新的V16.0.3测试可用。
第一个是BASE是游戏本体,而第二个是更新包,我们要提取的表情就在游戏本体里。
下载游戏文件解包工具:NCA-NSP-XCI_TO_LayeredFS_v1.6.rar[注 2],把下载的prod.keys放在同一的文件夹下。
打开脚本NCA-NSP-XCI_TO_LayeredFS.bat,第一个界面是选择要处理的文件类型,因为我们本次的解压的是NSP商店包,所以选择 2. eShop NSP。
之后选择对文件进行的操作,我们选择1. Extract Eshop NSP。
之后脚本提示我们把文件拖入窗口,选择刚才的BASE文件然后回车。
在解包结束后生成一个Extracted_NSP的子文件夹,里面会有些nca、cert、tik文件,其中后续会用到的文件有
将tik文件拖到NCA-NSP-XCI_TO_LayeredFS工具包里的脚本获取titlekey.bat上
这个32位字符串就是我们后续解包NCA所需的titlekey。
提取NCA文件里的Romfs文件夹
这一步骤我们还是用到脚本NCA-NSP-XCI_TO_LayeredFS.bat,选择需要提取的文件类型1. NCA,随后选择2. Extract Ecrypted NCA提取已加密的NCA包,之后选择2. Romfs folder我们把提取的文件释放到文件夹,之后拖入上面提到的体积最大NCA包,输入获取的32位titlekey后回车。
如果解包顺利你可以看到最后有如下的输出,若提示prod.keys不存在等信息,尝试把prod.keys 重命名为keys.ini后重新解包。
这告诉我们UE4引擎的资源包pak和ucas文件都已经成功输出到Extracted_NCA\romfs\RC\Content文件夹下了。
确定所用引擎版本
需要用到另一个脚本UnrealPakSwitchv10[注 3],我们把提取出的pakchunk0-Switch.pak复制到解压后的文件夹内,将pak文件拖动到脚本1.check.cmd就能看到当前使用的UE引擎版本。
一定要把pak文件复制到脚本同一文件夹下。因为作者的编写问题,脚本会以pak包所在文件夹的相对位置去调用u4pak.py,如果pak文件在不同文件夹就无法调用
脚本提示我们pak包版本可能是11或者11.27。按照脚本发布作者的原帖可以找到,对应的引擎版本是Unreal Engine 4.26.2 (for v11 *.pak),或Unreal Engine 4.27.2 (for v11.27 *.pak)。
题外话:UnrealPakSwitchv10本身设计也有解压pak包的功能,但本次教程并没有使用这个方法。其一需要下载原UE4引擎再调用其中的UnrealPak.exe,下载UE引擎略微麻烦。其二超侦探的包虽然没有加密,但是提取出的并不完整,原因不明。
非加密UE4的资源查看方式1:UnrealPakViewer
在前面的操作中我们已经提取到了pak和ucas文件,以下就进入到常规的UE4引擎游戏解包流程。
查阅资料的时候我发现大多数都是针对pak的解包教学,但是很少有人提到另一个文件ucas,而在我们解包出来的资源文件中,ucas明显应该是包含更多资源的。
查询了UE官方wiki[注 4]和一些论坛讨论后逐渐了解到,在UE4和UE5引擎更新了一种打包方式,优化原来的pak包的资产存储模式来加快加载速度。可以简单地理解为:
.pak 存储访问率低的文件,在《超侦探事件簿:雾雨迷宫》中主要存储游戏剧情动画,音乐等。
.utoc 是一个描述文件,主要记载容器文件压缩格式以及是否被加密。
.ucas 存储游戏中的主要数据,在本作游戏中所有的场景贴图,人物建模和动作,以及UI等资产都在这个包里。

UnrealPakViewer[注 5]是一个界面友好的pak查看器,README中描述也支持ucas文件,但是使用过程中发现只能读取到ubulk文件,无法直观的看到素材资产。怀疑可能是没办法导入utoc的原因。
下载工具后打开脚本Run.bat就可以把pak包拖进窗口使用树形图方式阅览。

pak包中主要的内容集中在RC/Content/CriData路径下,awb是音频格式,里面存放着游戏的BGM和效果音以及人物配音。在Moives文件夹下的usm文件是游戏的剧情动画,而RC/Content/RC/Ul/Font/FontFace路径下存放的是游戏所用字体。
右键Extract选择提取文件到文件夹,对于usm视频文件选择用vgmtoolbox[注 6]工具来查看。

VGMToolbox → Misc . Tools → Stream Tools → Video Demultiplexer 打开视频提取工具,格式选择USM,右侧勾选提取音频与视频,按照提示将文件拖入上方的Drop Files Here区域,等待转换进度条完成,可以在原usm文件所在文件夹找到同名m2v文件,主流播放器即可正常播放。

非加密UE4的资源查看方式2:UEViewer
上文说到无法直接提取的ucas文件,也有其他更强大的软件可以进行破解,这里使用的是最强大的UE引擎提取软件UEViewer[注 7]。
文件输入我们NCA部分提取到的整个Paks文件夹地址,勾选Overmide game detection,引擎选择UE4 4.27版本,这里不勾选具体引擎版本虽然可以阅览资源目录,但是在预览的时候无法正常查看模型和贴图等资产。

下面的Platform可以选择游戏原始平台,这里我们不勾选switch的原因是UEViewer论坛中有帖子[注 8]提到勾选后纹理显示可能会不正常。
打开资产树状图,忽略掉Engine和Plugins(引擎与插件)两个配置文件夹,我们主要的提取内容在RC/Content/RC路径下,也就是新增的ucas文件包含内容。
UEViewer在打开无法正常解析的文件时会整个软件崩溃,所以建议pak文件夹常开随时准备重启UEViewer后输入path。此外UEViewer的文件提取并不全,像RC/Content/CriData路径下的音频文件在UEViewer中没有正常显示,暂时没有查到相关解决资料
超侦探的人物模型在RC/Content/RC/Characters文件夹下,但是并不是按照人物命名分类的,而是编号+子编号的方式。例如002代表小死神,003代表大死神,后续子编号则代表不同场景下的模型。
子文件夹分别对应材质Materials、模型Meshes、动作Motins、分支Sequence、纹理Textures,下面的部分uasset文件可以用UEViewer内置的预览器预览。
我们打开Chr00300文件夹,这个对应了大死神的主要场景素材文件,

而我们想要提取的表情包则是附着在对话框上的(如下图),那么它应该属于游戏UI的一部分(这里感谢麻衣舞HalfMai的指点),顺着这个思路开始分析UI文件夹中的结构。

在UI文件夹中,可以看到类似于菜单Menu、对话记录BackLog,谜迷宫NzUI、游戏标题Title等子文件夹,其中COMMON这个UI引起了注意。

终于我们在UI/COMMON/Character/FaceChip下找到了想要的对话框表情包,而旁边的FaceEffects自然就是表情动效的其他素材。右键文件夹选择Export folder content,就可以将整个文件夹内的素材用UEViewer内置的转换器导出为TGA图片格式,至此我们的解包之旅终于告一段落。
还没完?图片的格式转换
TGA的图片格式虽然可以用常规图片浏览软件和PS正常打开,但是透明通路部分是无法正常查看的,需要转换为PNG等更通用的格式。原本自己搓轮子的时候发现已经有前人做好了工具tga2png[注 9](开源最棒!),我需要做的只有写一个批量转换脚本即可。
将以上内容保存到文本文件,修改后缀为bat。将下载好的tga2png和保存的脚本与TGA图片放在同一文件夹,双击即可批量转换。

“累死小爷了”
本次解包出来的小死神与大死神表情包也分享给大家,See You Next Time。
https://nbxx.lanzouj.com/ioPvZ11u39bg

这一次的解包虽然收获颇丰,但是仍然有很多我没有涉及到的内容,有待后续学习:
xci、nsz格式的解包
UE4引擎的aes key提取
UE5引擎的解包
UE Viewer中无法查看部分文件的真实原因
模型的提取与导入
UE引擎游戏制作实操(地图文件和流程文件的理解)

本文涉及到的参考文章与工具下载链接如下
https://prodkeys.net/
https://shipengliang.com/games/switch-%E8%A7%A3%E5%8C%85-%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B.html
https://gbatemp.net/threads/how-to-unpack-and-repack-unreal-engine-4-files.531784/
https://docs.unrealengine.com/5.0/en-US/zen-loader-in-unreal-engine/
https://github.com/jashking/UnrealPakViewer
https://sourceforge.net/projects/vgmtoolbox/
https://github.com/gildor2/UEViewer
https://www.gildor.org/smf/index.php/topic,8627.msg45495.html
https://github.com/shusaura85/tga2png