3DS解包操作说明书——3dstool工具详解(上)

16 | 12 | 2014

随着3DS的破解,汉化3DS游戏变成了可能,不少汉化组也纷纷开坑,加入了3DS游戏的汉化工作。那么,随着这场声势浩大的汉化大潮滚滚而来,相信不少小伙伴们是不是和我一样,都非常想加入到汉化工作中,为自己的喜爱的游戏添上自己的一份力。但是苦于没人指导,没办法入门。

近日,dnasdw大神发布了一款3ds的ROM解包打包工具——3dstool。这款工具对之前的3DS工具进行了一个整合,让大家能够较为轻松的完成ROM提取打包在电脑上的操作。本文也将以3dstool工具的操作为基础,和大家聊聊ROM解包的流程。与其说是教程,更不如说是科普吧。还有,要重点提一下:汉化游戏和玩游戏完全是两件事,汉化是一项非常枯燥无聊的工作,没有耐心是坚持不下去的。所以呢,在开始看文章之前,不要抱着我马上就能学会汉化,然后多久就能汉化出游戏这样的心态进行学习和探索,而是把它当作闲暇之余的兴趣来培养,相信你会收获更多。最后,还是要感谢各个汉化组的辛勤工作,没有他们的努力,就没有3DS的汉化。

好的,废话说完了,我们开始进行ROM解包的过程吧。

首先我们需要准备一些工具,这些工具将在提取过程中帮助我们完成很多工作:

1.3dstool(dnasdw):https://github.com/dnasdw/3dstool

2.3DS_Multi_Decryptor(Relys):https://github.com/Relys/3DS_Multi_Decryptor

3.Python 2.X

3.slot0x25KeyX.bin http://pan.baidu.com/s/1c0zqZg0

PS.许多同学之前没使用过github,具体的资料可以百度,我简单介绍一下github就是开源软件的代码分享中心吧,用户可以把自己的代码放在github上供大家参考,也可以进行多人开发,版本控制等,非常方便。

PS2.若是有同学在使用3dstool工具时提示缺少LIBEAY32.dll的话,可以搜索dll文件,下载后放入系统盘/Windows/System32中即可。

打开了两个网页后怎么使用呢,点击右边的Download ZIP就可以把所有的内容打包下载了(3dstool更新后,3dstool.exe以及ignore.txt文件会放在release中,请直接在这下载:https://github.com/dnasdw/3dstool/releases)。

图片1

下载好两个工具,我们还需要准备需要解包的游戏ROM,在本文中,我会使用心游汉化组的逆转裁判5、多玩汉化组的俄罗斯方块、以及欧版游戏0940-开膛手杰克进行解包演示。

图片2

操作过程一:使用3DS生成xorpad文件

PS.若是手里没有4.5机器的同学,可以下载心游汉化组的逆转裁判5、多玩汉化组的俄罗斯方块,从操作过程二开始进行解包操作。

1.安装python,这样就可以使用.py编写的程序,例如接下来需要使用到的ctrKeyGen.py;

2.取出3DS_Multi_Decryptor-master文件夹下的ctrKeyGen.py,将我们的第一个ROM文件,cat-aajp.3ds(0940-开膛手杰克)拖到ctrKeyGen.py上面,会弹出一个命令窗口,一闪而过后,就会在3ds文件相同的目录下,生成ncchinfo.bin文件;

图片3

3.将3DS_Multi_Decryptor-master文件夹下的launcher.dat与第2步生成的ncchinfo.bin和slot0x25keyX.bin放到4.5版本、已破解3DS的SD卡中,并将3DS开机;

4.在3DS上依次操作“本体设置 – 其他设置 – 用户情报 – DS软件设置”,这时会进入命令窗口,选择第一项NCCH padgen,等待直到屏幕最下行出现Finished字样;(出现finished后,机器上按B回到主菜单,然后长按关机键关机吧)

图片4

5.读取SD卡,会发现多出了几个xorpad文件,这样,我们的xorpad文件就生成好了。

操作过程二:提取cci

准备好以下这些文件,我们就可以开始进行解包操作了:

1.3DS游戏的ROM文件;

2.各个xorpad文件(为了方便打字,我把前面的一串字符去掉)

3.3dstool工具(在3dstool-master\bin文件夹中)

图片5

首先,我们按住键盘上的SHIFT键,同时右击文件夹中空白处,点击在此处打开命令窗口。

图片6

 

开始进行解包操作了,先输入“MD cci”创建文件夹cci。

图片7

接着键入命令“3dstool -xvt0f cci cci\0.cxi cat-aajp.3ds –header cci\ncsdheader.bin

图片8

我们可以发现提取出了一个cxi和ncsdheader.bin文件。

我们再来看看这句命令“3dstool -xvt0f cci cci\0.cxi cat-aajp.3ds –header cci\ncsdheader.bin

“3dstool”大家都看得懂,就是调用3dstool.exe这个工具;

–xvt0f cci cci\0.cxi cat-aajp.3ds”这句大家就可能不知道了,让我们打开3dstool文档来看看(见附录1):

图片9

–xvt0f cci cci\0.cxi cat-aajp.3ds”中,-x是从目标文件提取,-v是显示信息,-t是文件类型,-0是第0分区的cxi文件,-f是目标文件,噢,参数是可以合并的,所以“-x -v -t -0 -f”与“-xvt0f”功能是一样的。那么这代码翻译过来就是:“从目标文件(cat-aajp.3ds)中提取位于cci文件第0分区的cxi文件,提取到cci文件夹中的0.cxi文件中”

–header cci\ncsdheader.bin”是提取目标文件(cat-aajp.3ds)中的头文件,所以在完成代码后,我们得到了“0.cxi”和“ncsdheader.bin”两个文件。

细心的小伙伴可能已经发现了,在CMD中提示“INFO: partition 1(7) is not extract”,这句话指的是在cci文件中,还有第1分区的1.cfa和第7分区的7.cfa没有被提取出来,然后我们就需要改变命令中的参数重新提取这两个文件:“3dstool -xvt17f cci cci\1.cfa cci\7.cfa cat-aajp.3ds”:

图片10

好的,我们已经提取出所有的cci文件中的分区。那如果我提取的分区,在cci文件中不存在,会出现什么提示呢,我们再来额外进行一次测试:“3dstool -xvt01237f cci cci\0.cxi cci\1.cfa cci\2.cfa cci\3.cfa cci\7.cfa cat-aajp.3ds –header cci\ncsdheader.bin”:

图片11

我们看到,因为cci文件分区中没有这两个文件,不存在的分区是无法提取出来的,所以不用担心写错参数会提取出错误的数据,依次类推,我们可以得到cci文件中所有分区的文件了。

还有,如果我们在将代码后面的“–header cci\ncsdheader.bin”去掉,会发生什么呢:

图片12

软件非常机智的告诉我们ncsdheader头文件没有提取。

操作步骤三:提取cxi/cfa

得到了cxi文件,我们可以进行下一步的提取了。在这一步中,我们需要步骤一中提取的xorpad文件了。

首先依然是创建文件夹“MD cci\cxi0”:

图片13

接着键入以下命令“3dstool -xvtf cxi cci\0.cxi –header cci\cxi0\ncchheader.bin –exh cci\cxi0\exh.bin –plain cci\cxi0\plain.bin –exefs cci\cxi0\exefs.bin –romfs cci\cxi0\romfs.bin –exh-xor Main.exheader.xorpad –exefs-xor Main.exefs_norm.xorpad –romfs-xor Main.romfs.xorpad”:

图片14

成功提取出5个文件,我们再来仔细看看代码:“3dstool -xvtf cxi cci\0.cxi –header cci\cxi0\ncchheader.bin –exh cci\cxi0\exh.bin –plain cci\cxi0\plain.bin –exefs cci\cxi0\exefs.bin –romfs cci\cxi0\romfs.bin –exh-xor Main.exheader.xorpad –exefs-xor Main.exefs_norm.xorpad –romfs-xor Main.romfs.xorpad

-xvtf cxi cci\0.cxi”与上文类似,就是提取cxi文件;

–header cci\cxi0\ncchheader.bin”、“–exh cci\cxi0\exh.bin”、“–plain cci\cxi0\plain.bin”、“-exefs cci\cxi0\exefs.bin”、“–romfs cci\cxi0\romfs.bin”这五段代码非常类似,都是这种:“前面是命令,后面是提取到哪个文件”的格式,都比较容易理解;

重要的是最后一段,在这一步有三段代码:“–exh-xor Main.exheader.xorpad”、“–exefs-xor Main.exefs_norm.xorpad”、“–romfs-xor Main.romfs.xorpad”分别使用了我们从3DS上提取出来的3个xorpad文件,若是没有这三段代码,那么提取出来的文件会是错误的。三段代码的格式也非常类似,空格前面是命令,空格后面是使用哪个xorpad文件,仔细看还会发现是对应的,“–exh-xor”命令使用的是从3DS中提取出的“Main.exheader.xorpad”,“0.cxi”使用的xorpad是以Main开头的,以此类推。

如果在这一步使用错误的key(如–key0)或者错误的xorpad提取出bin文件,那么在下一步,bin文件将会不可读,这也就是说,我们没办法省略3DS上提取xorpad文件的操作,每个ROM的xorpad都是不通用的。

提取完0.cxi的文件,我们接着来处理1.cfa文件以及7.cfa,其实处理方式大同小异,首先创建文件夹cfa1和cfa7,然后直接上代码:“3dstool -xvtf cfa cci\1.cfa –header cci\cfa1\ncchheader.bin –romfs cci\cfa1\romfs.bin –romfs-xor Manual.romfs.xorpad”与“3dstool -xvtf cfa cci\7.cfa –header cci\cfa7\ncchheader.bin –romfs cci\cfa7\romfs.bin –romfs-xor UpdateData.romfs.xorpad”:

图片15

1.cfa文件中是游戏手册内容,所以我们使用“Manual.romfs.xorpad”进行提取,7.cfa文件中是游戏更新档案,所以我们使用“UpdateData.romfs.xorpad”进行提取大家可以记一下。其余的cfa也同样使用各自的xorpad文件进行提取。

操作过程四:提取bin

让我们直接键入代码:“3dstool -xvtf romfs cci\cxi0\romfs.bin –romfs-dir cci\cxi0\romfs

图片16

大家看,直接提取出了各种资源文件,这句代码也非常好理解:

-xvtf romfs cci\cxi0\romfs.bin”提取romfs文件;

–romfs-dir cci\cxi0\romfs”提取romfs并组成romfs文件的文件夹。

接下来exefs.bin文件也是使用同样的方法进行提取,但是这里请注意,exefs提取时,可能需要把“-xvtf”改为“-xvtfu”,因为在部分游戏中,exefs文件是使用反向LZ77压缩的(具体是否需要添加“-u”,需要查看exh中的标记信息,若是exh.bin的0000000dh位的值为1时,需要加“-u”,如图1),所以需要将代码改为“3dstool -xvtfu exefs cci\cxi0\exefs.bin –exefs-dir cci\cxi0\exefs”(如图2):

图片17

图片18

我们在这发现有提示,头文件没有提取出来,那么我们在代码后面加上一段“–header cci\cxi0\exefs\exefsheader.bin”:

图片19

“cfa1”文件夹中的romfs.bin文件也使用相同的方法进行提取:“3dstool -xvtf romfs cci\cfa1\romfs.bin –romfs-dir cci\cfa1\romfs”:

图片20

“cfa7”文件夹中的romfs.bin文件也使用相同的方法进行提取:“3dstool -xvtf romfs cci\cfa7\romfs.bin –romfs-dir cci\cfa7\romfs”:

图片21

好了,到此为之,所有的提取工作都完成了,我们得到了ROM中的资源文件。



正确代码汇总:

//提取出0.cxi、1.cfa、7.cfa、ncsdheader.bin四个文件

MD cci

3dstool -xvt017f cci cci\0.cxi cci\1.cfa cci\7.cfa cat-aajp.3ds --header cci\ncsdheader.bin

//提取出cxi0、cfa1、cfa7中的exefs、romfs资源包

MD cci\cxi0

3dstool -xvtf cxi cci\0.cxi --header cci\cxi0\ncchheader.bin --exh cci\cxi0\exh.bin --plain cci\cxi0\plain.bin --exefs cci\cxi0\exefs.bin --romfs cci\cxi0\romfs.bin --exh-xor Main.exheader.xorpad --exefs-xor Main.exefs_norm.xorpad --romfs-xor Main.romfs.xorpad

MD cci\cfa1

MD cci\cfa7

3dstool -xvtf cfa cci\1.cfa --header cci\cfa1\ncchheader.bin --romfs cci\cfa1\romfs.bin --romfs-xor Manual.romfs.xorpad

3dstool -xvtf cfa cci\7.cfa --header cci\cfa7\ncchheader.bin --romfs cci\cfa7\romfs.bin --romfs-xor UpdateData.romfs.xorpad

//提取exefs、romfs资源包中的资源

3dstool -xvtf romfs cci\cxi0\romfs.bin --romfs-dir cci\cxi0\romfs

3dstool -xvtfu exefs cci\cxi0\exefs.bin --exefs-dir cci\cxi0\exefs --header cci\cxi0\exefs\exefsheader.bin

3dstool -xvtf romfs cci\cfa1\romfs.bin --romfs-dir cci\cfa1\romfs

3dstool -xvtf romfs cci\cfa7\romfs.bin --romfs-dir cci\cfa7\romfs

操作演示:

接着,我使用另外两个ROM进行操作,与大家回顾一下操作过程:

俄罗斯方块(tetris-1008.3ds)与逆转裁判5(逆转裁判5本篇汉化版.3ds)都是已经由汉化组进行汉化后再打包的,经过测试,汉化组在打包过程中是使用–key0进行打包的,所以我们再进行解包操作的话,无需xorpad文件,直接使用–key0进行解包操作就可以了。

1.先输入“MD cci”创建文件夹cci。

图片22

2.键入命令“3dstool -xvt0f cci cci\0.cxi tetris-1008.3ds –header cci\ncsdheader.bin

图片23

提取出一个cxi和ncsdheader.bin文件,而且没有其他分区未提取的提示。

3.创建文件夹“MD cci\cxi0”:

图片24

4.输入命令“3dstool -xvtf cxi cci\0.cxi –header cci\cxi0\ncchheader.bin –exh cci\cxi0\exh.bin –logo cci\cxi0\logo.bcma.lz –exefs cci\cxi0\exefs.bin –romfs cci\cxi0\romfs.bin –key0

图片25

成功提取出5个文件。

我使用的是“–key0”进行提取,这是因为汉化组在汉化完成后,是使用“–key0”进行打包的;如果解包的是原版ROM,则需要使用xorpad文件进行提取(见上文案例)。

再次强调:如果在这一步使用错误的key或者错误的xorpad提取出bin文件,那么在下一步,bin文件将会不可读,这也就是说,我们没办法省略3DS上提取xorpad文件的操作,每个ROM的xorpad都是不通用的。

5.键入代码:“3dstool -xvtf romfs cci\cxi0\romfs.bin –romfs-dir cci\cxi0\romfs

图片26

提取出了各种资源文件。

6.“3dstool -xvtfu exefs cci\cxi0\exefs.bin –exefs-dir cci\cxi0\exefs –header cci\cxi0\exefs\exefsheader.bin”:

图片27

嗯,提取资源文件完成。

 

第三次提取过程,我们再一起快速的重复一遍,拿逆转裁判5(逆转裁判5本篇汉化版.3ds)ROM作为例子,先准备好工具和ROM:

图片28

第一步-1:尝试提取cci“3dstool -xvt0f cci cci\0.cxi nzcp.3ds –header cci\ncsdheader.bin

图片29

第一步-2:根据提示修改代码,增加1和7两个分区的提取“3dstool -xvt017f cci cci\0.cxi cci\1.cfa cci\7.cfa nzcp.3ds –header cci\ncsdheader.bin

图片30

第二步:建立文件夹“MD cci\cxi0”提取cxi“3dstool -xvtf cxi cci\0.cxi –header cci\cxi0\ncchheader.bin –exh cci\cxi0\exh.bin –logo cci\cxi0\logo.bcma.lz –plain cci\cxi0\plain.bin –exefs cci\cxi0\exefs.bin –romfs cci\cxi0\romfs.bin –key0

图片31

(logo文件不存在,忽略)

第三步:提取romfs“3dstool -xvtf romfs cci\cxi0\romfs.bin –romfs-dir cci\cxi0\romfs

图片33

第四步:提取exefs“3dstool -xvtfu exefs cci\cxi0\exefs.bin –header cci\cxi0\exefs\exefsheader.bin –exefs-dir cci\cxi0\exefs

 

完成。

让我们来看看提取出的资源文件吧:

图片34

接下来的工作就是进行文本图片的导出,字库的破解等,在本文中就不进行讨论了,同时,期待有更多的汉化爱好者能够加入到我们中来,生命不止,汉化不息。哈哈。

 

附录:


3dstool 1.0 by dnasdw

 

用法: 3dstool [选项...] [选项]...

 

选项:

功能:

-x, --extract 从目标文件提取

-c, --create  创建目标文件

-e, --encrypt 加密目标文件

-u, --uncompress

通过反向LZ77算法解压目标文件

-z, --compress

通过反向LZ77算法压缩目标文件

-r, --trim    缩减cci文件

-p, --pad     填充cci文件

--sample  查看例子

-h, --help    查看帮助

 

通用:

-t, --type    [[card|cci|3ds]|[nand|exec|cxi]|[data|cfa]|exefs|romfs]

文件类型,可选的

-f, --file    目标文件,必需的

-v, --verbose 显示信息

cci/cxi/cfa/exefs:

提取/创建:

--header  目标文件的头文件

加密:

--key0    --key 00000000000000000000000000000000的缩写

--key     使用AES-CTR加密时的十六进制写法的key

--counter 使用AES-CTR加密时的十六进制写法的counter

--xor     使用异或加密时的异或数据文件

解压/压缩:

--compress-out

解压或压缩时的输出文件

 

cci:

提取/创建:

-0, --partition0

位于cci文件第0分区的cxi文件

-1, --partition1

位于cci文件第1分区的cfa文件

-2, --partition2

位于cci文件第2分区的cfa文件

-3, --partition3

位于cci文件第3分区的cfa文件

-4, --partition4

位于cci文件第4分区的cfa文件

-5, --partition5

位于cci文件第5分区的cfa文件

-6, --partition6

位于cci文件第6分区的cfa文件

-7, --partition7

位于cci文件第7分区的cfa文件

缩减:

--trim-after-partition

[0~7], 保留的最后分区号,可选的

 

cxi:

创建:

--not-update-exh-hash

--not-update-extendedheader-hash

不更新extendedheader的校验值

--not-update-exefs-hash

不更新exefs头部的校验值

--not-update-romfs-hash

不更新romfs头部的校验值

--not-pad 不追加填充数据

提取:

--exh

--extendedheader

cxi文件的extendedheader文件

--logo

--logoregion

cxi文件的logoregion文件

--plain

--plainregion

cxi文件的plainregion文件

--exefs   cxi文件的exefs文件

加密:

--exh-xor

--extendedheader-xor

加密cxi文件的extendedheader部分用的异或数据文件

--exefs-xor

加密cxi文件的exefs部分用的异或数据文件

--exefs-top-xor

加密cxi文件的exefs第一段用的异或数据文件

cfa:

提取/创建:

--romfs   cxi或cfa文件的romfs文件

encrypt:

--romfs-xor

加密cxi或cfa文件的romfs部分用的异或数据文件

 

exefs:

提取/创建:

--exefs-dir

组成exefs文件的文件夹

 

romfs:

提取/创建:

--romfs-dir

组成romfs文件的文件夹