三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

3dsconv实战:把.3ds转CIA,从加密检测到批量转换的完整流程

3dsconv实战:把.3ds转CIA,从加密检测到批量转换的完整流程

3dsconv实战:把.3ds转CIA,从加密检测到批量转换的完整流程

【免费下载链接】3dsconvPython script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv

你有没有过这种时刻:出门前翻半天抽屉,就为找一张3DS卡带,结果主机里还插着另一张游戏。把卡带转成数字版统一存进主机,绕不开一个动作——把.3ds转CIA。3dsconv 就是干这个的 Python 小工具,加密状态自动识别、多文件批量处理,一次就能整理完整个游戏库。

我第一次拿到一整批转储好的 .3ds 文件时,心里只有一个念头:谁能帮我把它们全部变成能直接安装的 CIA?试过几个工具之后,3dsconv 成了我留在硬盘里的那一个。这篇文章不打算写成说明书式的参数罗列,而是把我从"第一次跑通"到"批量整理整个游戏库"的过程完整讲给你听,每一步都可复现。

动手之前,先分清两个格式

你可以把 .3ds(也叫 CCI)理解成一张卡带的"完整照片":它逐字节记录了卡带里的所有内容,适合长期保存和备份,却不能直接装进主机。CIA 则是"安装包",更像一个快递盒——主机收到后会自己拆包,把游戏注册进系统。所谓转换,就是读懂照片里的数据,再按 CIA 的规则重新打包。

转换本身并不神秘,真正麻烦的是加密:很多卡带转储出来的文件带着加密,直接打包出的东西根本没法用。这也是 3dsconv 最值得说的地方——它会在动手前先判断文件处于哪种加密状态,再决定要不要解密、用哪种方式解密,你几乎不用做选择题。

两步装好3dsconv环境

3dsconv 需要 Python 3 环境,处理加密文件时还需要 pyaes 这个加密库。安装过程非常短,两条命令:

pip install pyaes python3 setup.py install

装完之后,终端里就多了3dsconv这个命令。如果你不想动系统环境,也可以直接运行仓库里的脚本python3 3dsconv.py 你的游戏.3ds,效果完全一样。

装好先别急着转。运行一遍不带任何参数的3dsconv,它会打印出全部可用选项——这是每个新手都该养成的习惯,比死记参数列表有用得多。

完成第一次.3ds转CIA的基础转换

准备工作就绪,找一张未加密的 .3ds 文件(手头全是加密文件的话,先跳到第五节准备 boot9.bin 再回来),执行:

3dsconv game.3ds

转换开始后,屏幕上会出现一个百分比进度条。等待的时间里,工具其实做了不少事:

  1. 校验文件头魔数,排除 NAND 备份等冒牌文件
  2. 读取标题 ID,为后续生成证书、票据做准备
  3. 从 ExeFS 里提取游戏图标,写进安装信息
  4. 逐块读取分区数据,边写边计算 SHA-256 哈希
  5. 最后补全证书链、哈希表,生成完整 CIA

转换完成后,当前目录下会出现一个game.cia,文件名与源文件一致。输出位置默认在当前目录,也可以用--output=./cia显式指定,目录不存在时工具会自动创建。

3dsconv加密检测:三种状态一张表看懂

3dsconv 从文件头的加密标志位就能判断文件状态,我把识别逻辑整理成了速查表,转档前对照一眼心里就有数:

文件状态识别依据你还需要准备转换结果
未加密NoCrypto 位已置位什么都不用直接转换
zerokey 加密低位标志置位装好 pyaes 即可自动解密后转换
NCCH 加密两个标志位都未置位pyaes + boot9.bin自动解密后转换

所谓 zerokey 加密,其实是用了全零密钥的"形式加密",工具自己就能解开;真正需要外部钥匙的是 NCCH 加密,也就是大多数零售卡带的加密方式。很多人第一次转换加密文件会卡住,原因往往不是工具不行,而是缺了那把"钥匙"。

用boot9.bin解密加密的3ds文件

boot9.bin 是 3DS 主机的 ARM9 bootROM 转储,相当于一把"万能钥匙",获取途径只有一个:从已破解的主机里提取。如果你的机器已经装好 boot9strap,开机时按住 START + SELECT + X,它会自动把文件转储到存储卡的boot9strap目录下。

拿到文件后,你不需要配置任何复杂的东西。3dsconv 会按固定顺序自动查找:

  1. 命令行参数--boot9=指定的路径
  2. 当前目录下的boot9.bin(完整版)
  3. 当前目录下的boot9_prot.bin(保护版)
  4. 用户主目录~/.3ds/下的boot9.bin
  5. 用户主目录~/.3ds/下的boot9_prot.bin

也就是说,把 boot9.bin 丢进当前目录直接转换就行;文件放在别处的话,用参数显式指路:

3dsconv encrypted_game.3ds --boot9=/path/to/boot9.bin

顺带提醒:工具加载 boot9.bin 时会校验内部密钥的哈希值,文件不完整或来源可疑都会被拒之门外。这其实是好事,能避免你拿着错钥匙转出一堆坏文件。

3ds游戏批量转换与常用参数

单文件跑通之后,批量处理几乎不增加学习成本。3dsconv 天然支持多文件参数,把要转的文件依次列在后面即可:

3dsconv game1.3ds game2.3ds game3.3ds

配合几个常用参数,就能搭起一条完整的整理流水线:

  • --output=<目录>:统一输出到指定文件夹,方便后续拷贝进主机
  • --overwrite:覆盖已存在的 CIA,重转时不用先手动删文件
  • --verbose:打印每个分区的处理细节和哈希值,方便留档排查
  • --ignore-bad-hashes:跳过哈希校验强制转换(谨慎使用,见下文)
  • --ignore-encryption:当文件其实未加密、但标志位有误时,强制按未加密处理

另外两个参数了解一下即可:--dev-keys用于开发者机型的极少数特殊标题,普通玩家基本用不上。

转换失败的3个排查要点

流程跑顺之后,提前把坑讲清楚,能帮你省下不少折腾时间。

坑一:报错"输出文件已存在"。工具默认不覆盖已有文件,防止误操作。确认要重转就加--overwrite,或者换个--output目录,二选一。

坑二:提示哈希校验失败。转换前工具会校验 ExtHeader 等区域的哈希,校验不过通常说明源文件损坏或不完整。先别急着用--ignore-bad-hashes硬转,优先重新转储源文件;只有你非常确定文件完好时,才考虑跳过校验。

坑三:明明有 boot9.bin 还是报加密错误。检查三处:文件是否放在工具能自动找到的路径上、是否用--boot9=指定了正确路径、文件哈希是否可信。完整版 boot9.bin 的 SHA-256 以2f88744f开头,保护版以7331f7ed开头,和项目文档里公布的值对得上才算稳妥。

下一步行动清单

如果现在就要上手,按下面这个顺序走完,基本不会卡壳:

  1. 克隆仓库git clone https://gitcode.com/gh_mirrors/3d/3dsconv,进入目录
  2. 安装 pyaes,用python3 setup.py install装好工具
  3. 运行不带参数的3dsconv确认环境正常
  4. 拿一张未加密的 .3ds 完成第一次转换,验证输出
  5. 加密文件先备好 boot9.bin,放到自动查找路径
  6. --output--overwrite跑顺批量流程,留一份--verbose日志

转换工具只是手段,请记得只处理你合法拥有的游戏文件。等游戏库全部变成 CIA 装进主机,出门就再也不用纠结"带哪张卡"了——3dsconv 把这个问题从根上解决掉了。

【免费下载链接】3dsconvPython script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表