封面《イノセントガール》

前言

因为前年的时候想要机翻《彼女は高天に祈らない》这部作品,就试着进行拆包。但是发现常用拆包软件如 Garbro、KrkrExtract 等一些常见拆包封包工具都只能拆第一层包,没法继续拆其中的文本,其他音声什么倒是可以。考虑到当时资料比较少,同时为了防止自己再次忘记,因此记录一下之前的拆包流程。

前期工作

以《彼女は高天に祈らない》为例,打开游戏目录,可以看到如下文件:

游戏目录

其中 bg.bin 为一些背景图,gfx.bin 里面主要为立绘、差分表情、CG 等,se.bin 为音效,kanosora.bin 主要为游戏内的一些战斗系统程序,kanosora.cfg 为游戏的启动配置,kanosora.exe 为启动游戏,opening.mpgopening_hd.mpg 为 op 动画。script.bin 为游戏文本。snd.bin 为一些游戏背景音,voice.bin 为游戏角色语音。

其中除了 scripts.bin 其他都只有一层压缩,可以直接用 Garbro 等软件拆包。而 scripts.bin 为拆开如下图所示,内部还有一层压缩,需要进一步处理。且 Grabro 没有对 escu:de 老游戏有封包,因此了解如何进行拆包封包还是有必要的。

scripts.bin

拆包

文本第一层拆包

用 hex 编辑器打开 scripts.bin,这里推荐能看日文的,我用的是 010 editor,像 vscode 的 hex editor 这种插件不支持其他语言不容易破解,可以看到如下图所示:

hex

查询文件开头的 magic number ESC-ARC2,可以通过 google 或者 github 搜索。可以找到 asmodean 大佬的破解文档,asmodean’s reverse engineering page。这里有详细的解释,可以看一下。也可以看到 Crass-source 提供的格式说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ESC-ARC2格式:
首部:
s8 magic[8]; // "ESC-ARC2"
u32 key; // 解密entries和索引段用的key
u32 entries; // 资源文件数
u32 name_table_length; // 资源文件名称表的长度
索引段:
u32 name_offset; // 资源文件名在资源文件名称表内的偏移值
u32 offset; // 资源文件数据偏移(从首部算起)
u32 length; // 资源文件数据长度
资源文件名称表:
每个名称以NULL作分隔。
数据:
紧接在索引段之后:

首部:
s8 magic[4]; // "acp"
u32 uncomprlen; // lzw解压缩后的数据长度
数据:
紧接在首部之后;lzw code stream压缩码字流(位数据流)。

文本第二层拆包

解压缩后我们可以得到各个章节的文本,此处我们打开解码得到的 a_prol01_1.bin,可以看到如下图所示。这个时候换成日文编码就可以看到相对应的文本了。

a_prol01_1.bin

a_prol01_1.bin

这部分的拆包封包可以参考 EscudeEditor 的实现。大佬的博客原本有对其进行说明,现在没了,但其实看代码也能了解如何解码的。

战斗

最后的战斗系统文本主要在 kanosora.bin 中的 game_data.bin 中,这部分我不太会拆也没找到有人拆包。只能先放弃。

总结

这篇文章主要是为我记录一下之前的拆包流程,方便我后续重启项目的时候快速回顾

参考文献

asmodean’s reverse engineering page

Crass-source ESCARX.txt

EscudeEditor