【世界计划 多彩舞台】写给想进一步研究和利用游戏资源的人的指导
黒鯨
编辑于 2021年10月09日 18:57

这篇文章的目标读者是希望对PJSK的游戏数据资源进行深入研究和利用的人,主要内容是如何获得游戏完整的资源列表

如果只需要通常的解包或者需要特定的资源可以参见 BV1pV411y7co​ 或者去 sekai.best 寻找需要的资源

这篇文章基本上只是对前人文章的整合和扩充,不会给出关键数据

请务必配合这两篇文章阅读:

    文章1 https://dev.moe/2157

    文章2 https://blog.dnaroma.eu/2020/09/08/analyse-project-sekai-trial-version-md/

根据测试结果,PJSK在启动的时候会试图获取当前系统支持的资源列表,我们的目的就是去获取这个资源包并解析它,这样就可以获取游戏全部的资源文件的下载地址

必备知识:在文章2中有这么一段

    游戏使用 MessagePack 序列化数据,通过固定的 AES 密钥及 IV 进行 AES-128-CBC 加密,再通过 TLS(https)加密传输。

反推过来,解析过程大概可以分为这三步

  1. 抓取资源列表

  2. 解密资源列表

  3. 读取资源列表

一.抓取资源列表

    基本思路:正确设置手机网关并使用抓包器抓包,并让游戏认可抓包器的证书

    所需程序、文件:

        1.抓包器(能作为手机代理的)

        2.openssl

    难点:

        1.必须要特别的证书才能解密https通信的内容,否则就只能见到通讯建立时的明文数据包,但游戏似乎不信任系统证书以外的证书,以下是解决方法

            1-1将证书安装为系统证书,需要root或adb,这条路线也有两个难点

                1-1.1 证书类型的判断与转换

                    1-1.1.1系统证书的目标类型为PEM,如果不是则需要转换,转换可使用openssl

                    1-1.1.2系统证书的命名一定要规范,可使用openssl计算名称

                1-1.2 如果你使用的是模拟器,则模拟器需要满足以下条件

                    1.Android7以上

                    2.ARM64架构

                    3.合适的网络模式

                    4.root权限或adb

                    5.可以识别放进系统证书目录的证书

                    6.能运行PJSK,至少到下载资源不崩溃

            1-2修改游戏程序取消证书验证(这条路线没研究过)

    注意点:

        1.如果你的网络环境不能直接连上游戏服务器,则需为抓包器也配置网关

        2.抓包器需要允许其它设备将其作为代理

二.解密资源列表

    基本思路:通过反编译、反汇编获取游戏AES-128-CBC加密的key、iv,解密资源列表

    所需程序、文件:

        1.游戏的apk

        2.il2cppDumper

        3.IDA

        4.IDA的python插件

        5.c#反编译器

        6.openssl

        7.上一步抓到的资源列表

    注意点:

        1.IDA的python插件必须要配置正确的系统路径才能使用

    提示:

        1.文章2中提到的 https://www.perfare.net/1408.html 是非常重要的线索

        2.key和iv在 Sekai.APIManager 的构造函数当中,似乎是硬编码

        3.Sekai.APIManager 反汇编之后构造函数似乎不止一个?

三、读取资源列表

    所需程序、文件:

        1.上一步解密的资源列表

        2.一种喜欢的编程环境(推荐c#)

    基本思路:还原游戏资源列表的类,并读取资源列表的值

        其中还原类的时候有两种思路:

            1.把MessagePack转换为JSON并反推出类的成员

            2.通过Key值的名称在反编译的c#代码中找到资源列表的类

        读取资源列表的值也有两种思路:

            1.通过导入MessagePack的类库直接读取数值

            2.通过把MessagePack转换为JSON进行读取

    注意点:

        1.如果你使用的是c#,尤其是配合UNITY,注意MessagePack for c#有官方版和民间版之分,注意游戏使用的是哪一个

之后只要写一个程序依次拼合列表里的每个下载地址并下载就可以了

注意游戏每次更新都会跟换下载地址前面的一部分,抓包的时候可以顺带抓几个数据包观察一下下载地址的构成