ArcaeaSwitch数据解包


前言

  今天想到自己买了ns的arcaea一直嫌弃屏幕太小、手柄太难然后放着吃灰,当时一开始是冲着手柄模式还有独占曲包决定一定要买的,然后250入手了发现手柄模式就是个**,屏幕又太小打不习惯,而且tmd联动曲包居然单独收费,我只想说一句:

之前在这篇文章中已经有稍微对Arcaea进行过逆向分析了,现在又心血来潮想要把NS的独占曲包拿到iPad上来玩耍,不过iPad没越狱估计是不行了,那就先把曲包提取出来再说吧,网上搜了一圈没找到相关资料,只好自己动手丰衣足食了。

  因为之前在NS上下载Arcaea时就默认有了白姬的曲包,所以我推测白姬曲包的铺面文件应该在一开始的安装包中,而不是动态的去服务器请求下载,所以想办法获取到游戏本体然后进行解包提取就行啦。说干就干。

游戏本体获取

  我用的是正版NS,之前也没接触过NS破解相关的知识,所以甚至不知道游戏本体要去哪搞到,只能盲目的搜索破解版NS如何安装游戏之类的。总之了解到了破解机可以通过将破解游戏拷贝到SD卡中来进行安装,也了解到了游戏安装包是NSP和XCI格式的,前者是从eShop中下载到的,后者是从卡带中提取的,解包时前者需要进行解密而后者不用,这就是目前来说我对他们的浅显的理解。

  知道这些以后就去Google搜索Arcaea NSP之类的关键字,就能找到很多相关的页面了,只不过真正能下载到东西的可能不多,总之在忍受了一大堆广告和钓鱼链接之后,我终于下载到了Arcaea的NSP和XCI文件,还有他的DLC NSP文件,具体哪个网站就先不贴了,广告是真的多。

NSP文件的解包

  一开始拿到一个800多M的nsp文件也是一脸懵逼啊,搞安卓逆向的拿到一个apk就知道先zip解压或者直接拖到jeb里看看了,nsp文件我还是第一次接触,也不懂里面是啥组成格式,还是问问人类的好朋友谷歌吧。

参考链接:

  找了一圈找到了上面的教程,写的还是比较简单的,工具也被写成傻瓜版的批处理文件了,像我这种只打算对NS解包这块浅尝辄止的人还是比较适合用这个工具的。使用方法也很简单,教程里都有写,而且批处理文件的指示也很清楚。

  有一点稍微提一下,那就是在选择解包NSP文件和XCI文件的时候有一个区别,那就是NSP文件解包时要去获取一下Tilte key,而XCI文件则不需要。还有就是解包完成以后生成的romfs目录下的文件在不同游戏中也是不一样的,看了几个教程他们解包出来的romfs下有一大堆东西,而Arcaea解包出来就只有两个文件:arc.jsonarc.pack。我一开始还以为这俩文件应该还有工具能继续解包,然后去github上下了几个发现并没有什么卵用。

  由此我推测NS的解包到这步应该已经结束了,之所以解包出来的文件只有两个是因为616对这些资源自己还包了一层(我猜的,不对请轻喷),网上的工具只负责把NS的包解出来但是游戏本身如何打包的就不是他们负责的了。就好比一个ZIP解压缩的工具只能解压ZIP的文件,但是如果你这个ZIP文件解压出来以后是俩RAR文件那就得想办法用RAR再对这俩文件进行解压。

arc.pack的解包

  老办法又去google搜索,这次是真的找不到相关资料了,也许有人对Arcaea Switch已经解包过了但是还没公开相关资料,也许是游戏发布没几天而且比较冷门所以没人发吧,总之接下来要自己动手丰衣足食了。

  我们总共有两个文件:arc.jsonarc.pack,一个是json另一个是二进制文件,首先json我们非常熟,先稍微看下。

{
  "Groups": [
    {
      "Name": "startup",
      "Offset": 0,
      "Length": 4367519,
      "OrderedEntries": [
        {
          "OriginalFilename": "startup/StartScreen.csb",
          "Offset": 0,
          "Length": 15076
        },
        {
          "OriginalFilename": "startup/bg.jpg",
          "Offset": 15076,
          "Length": 699937
        },
        {
          "OriginalFilename": "startup/char_h.png",
          "Offset": 715013,
          "Length": 972242
        }
        ......

  啊这,该不会就是文件在pack里的偏移和大小吧。好吧事实证明确实是这样的。在json中随便搜索一下歌曲名也能搜到对应的ogg文件名,然后用010Editor打开arc.pack去对应的偏移中复制出这个文件,保存为ogg,果然能播放。继续在010Editor中观察pack文件,也看到了很多明文的图片和音乐文件,我比较关心铺面文件,所以搜索一下铺面文件相关的字符串,看了一下铺面开头都会写AudioOffset,也能搜到内容,说明铺面肯定是在pack里的。

  看来只要用json对pack文件进行解析就完事了。写个脚本自动搞吧,平时看java比较多,但是写的比较多的是js(因为用的是frida),感觉用java写有点麻烦,用js只会在frida和网页上用,单独拿来搞这个好像不知道怎么搞,想想还是用python吧,之前也稍微写过,学起来也快,用着也方便。还好这次的需求也不是很难,就学着写写吧,代码如下:

#!/usr/bin/python3
import sys
import json
import os

dumpPath = "dump"

if not os.path.exists(dumpPath):
    os.mkdir(dumpPath)
    
arcpack = open(sys.argv[2],'rb')

with open(sys.argv[1], 'r') as arcjson:
    data = json.load(arcjson)
    for group in data["Groups"]:
        groupPath = dumpPath + "/" + group["Name"]
        if not os.path.exists(groupPath):
            os.mkdir(groupPath)

        for OrderedEntrie in group["OrderedEntries"]:
            filePath = groupPath + "/" + OrderedEntrie["OriginalFilename"]
            if not os.path.exists(filePath[0:filePath.rfind("/")]):
                os.makedirs(filePath[0:filePath.rfind("/")])

            arcpack.seek(OrderedEntrie["Offset"])
            with open(filePath, 'wb') as dumpFile:
                dumpFile.write(arcpack.read(OrderedEntrie["Length"]))
                dumpFile.close()


    arcjson.close()

arcpack.close()

还是非常简单的,使用方法是将py文件和acr.json还有arc.pack放在同一目录,然后命令行输入python ns_arc_unpack.py arc.json arc.pack,或者传入绝对路径也许,懂得都懂。然后就完成解包啦,接下来康康把铺面拿到手机上能不能愉快玩耍,放张解包出来的CG然后本文到此结束!解包文件和脚本已上传GitHub

游戏CG


文章作者: 大A
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 大A !
评论
  目录