diff --git a/README.md b/README.md index 6d85b7d..9dd4543 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,20 @@ -# LL! SIF Private Server +# honoka-chan -LoveLive! 学园偶像祭自用私服 +LoveLive! 学园偶像祭、学园偶像季: 群星闪耀 自用私服。 -## How to use? +## 文档列表(更新中) -1. 首先你需要一台电脑,在电脑上安装安卓模拟器(例如雷电模拟器),在模拟器中安装 SIF 国服官方客户端并登录自己的账号; -2. 进入游戏右上角 `各种设置 - 批量下载`,将所有数据下载到本地,大约 11G 左右; -3. 模拟器开启 root 权限,然后备份游戏数据 `/data/data/klb.android.lovelivecn/files` ~~以及 `/data/data/klb.android.lovelivecn/shared_prefs` 目录下的账号数据 `GameEngineActivity.xml` 和 `klb.android.lovelivecn_preferences.xml`~~; -4. 从登录开始的过程中使用 WireShark 等工具对游戏响应数据进行抓取,并尽可能地将所有功能都使用一遍,以便于给后续开发做参考; -5. 反编译官方游戏安装包,替换客户端使用的公钥为你自己的,并替换盛趣相关的接口地址为本地或者远程服务器的地址,然后重新打包签名,这样我们才能在服务端解密数据包,可参考我的 [llsif-cn-client](https://github.com/YumeMichi/llsif-cn-client); -6. 都准备好后,现在需要一台有 root 权限的安卓手机(苹果 iOS 不了解)用于后续操作; -7. 在手机上安装修改后的客户端,然后将第 3 步中备份的数据解压到对应的目录下,修复好权限(chown); -8. 修改游戏默认的请求地址,使用 [HonokaMiku](https://github.com/YumeMichi/HonokaMiku) (我没有 VS 用来编译 Windows 二进制文件,Windows 用户可以使用 [libhonoka](https://github.com/DarkEnergyProcessor/libhonoka))解密游戏目录下的服务器配置文件 `/data/data/klb.android.lovelivecn/files/external/config/server_info.json`,将其中的 `prod.game1.ll.sdo.com` 都替换为自己的服务器地址,然后重新加密后替换掉相应文件并修复权限(chown); -9. 上述步骤都操作完成后运行 `honoka-chan`(第一次运行会生成配置文件,根据自身情况进行配置); -10. 手机运行游戏,使用账号密码登录,输入任意账号密码均可,上述步骤如果都没有问题,从登录开始的请求都会转发到 `honoka-chan`; -11. 后续即可根据第 4 步中抓取的数据包进行相应的服务端功能开发。 - -## 注意事项 - -1. ~~请备份账号数据后不要再通过官方客户端登录游戏,否则备份的账号信息会失效,后续登录需要填写验证码,该验证码通道可能会随着关服而关闭。~~ -2. ~~后续操作都在手机上进行的原因是我用的雷电模拟器,从 3669 开始往后地卡片,只要放入响应包中,游戏客户端都会崩溃。个人太懒了不想试其他模拟器了所以都在手机上进行操作。~~ -3. 模拟器系统尽量使用 32 位安卓 7,经测试兼容性最好,不会有 64 位的闲置一会儿闪退和低版本安卓 5.1 部分卡片加载会闪退(即原先上面的第 2 点)的问题,手机的话应该都没问题。 - -上述崩溃日志 -
-展开查看 -
-I/DEBUG   ( 1368): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
-I/DEBUG   ( 1368): Build fingerprint: 'asus/android_x86/x86:5.1.1/LMY47I/8.3.19:user/release-keys'
-I/DEBUG   ( 1368): Revision: '0'
-I/DEBUG   ( 1368): ABI: 'x86'
-I/DEBUG   ( 1368): pid: 3816, tid: 3834, name: GLThread 147  >>> klb.android.lovelivecn <<<
-I/DEBUG   ( 1368): signal 4 (SIGILL), code 2 (ILL_ILLOPN), fault addr 0xa415f674
-I/DEBUG   ( 1368):     eax 4f1c02df  ebx a44586d0  ecx 4f1c02df  edx a3db45e2
-I/DEBUG   ( 1368):     esi a081a480  edi a0842100
-I/DEBUG   ( 1368):     xcs 00000073  xds 0000007b  xes 0000007b  xfs 0000005f  xss 0000007b
-I/DEBUG   ( 1368):     eip a415f674  ebp a3db4b48  esp a3db4b10  flags 00010282
-I/DEBUG   ( 1368):
-I/DEBUG   ( 1368): backtrace:
-I/DEBUG   ( 1368):     #00 pc 002ab674  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so
-I/DEBUG   ( 1368):     #01 pc 0028fef0  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so
-I/DEBUG   ( 1368):     #02 pc 0032e11a  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so
-I/DEBUG   ( 1368):     #03 pc 0032d8de  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so
-I/DEBUG   ( 1368):     #04 pc 0029c9da  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so
-I/DEBUG   ( 1368):     #05 pc 002a1a98  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so
-I/DEBUG   ( 1368):     #06 pc 00391ac8  /data/app/klb.android.lovelivecn-1/lib/x86/libGame.so (app_klb_android_GameEngine_PFInterface_frameFlip+40)
-I/DEBUG   ( 1368):     #07 pc 00001660  /data/app/klb.android.lovelivecn-1/lib/x86/libjniproxy.so (Java_klb_android_GameEngine_PFInterface_frameFlip+48)
-I/DEBUG   ( 1368):     #08 pc 000d2a81  /system/lib/libart.so (art_quick_generic_jni_trampoline+49)
-I/DEBUG   ( 1368):     #09 pc 000d0428  /system/lib/libart.so (art_quick_invoke_stub+72)
-I/DEBUG   ( 1368):     #10 pc 003414a9  /system/lib/libart.so (art::mirror::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+201)
-I/DEBUG   ( 1368):     #11 pc 0046d981  /system/lib/libart.so (artInterpreterToCompiledCodeBridge+129)
-I/DEBUG   ( 1368):     #12 pc 0027669b  /system/lib/libart.so (bool art::interpreter::DoCall(art::mirror::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+427)
-I/DEBUG   ( 1368):     #13 pc 004b5eff  /system/lib/libart.so (bool art::interpreter::DoInvoke<(art::InvokeType)2, false, false>(art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+399)
-I/DEBUG   ( 1368):     #14 pc 000c23df  /system/lib/libart.so (art::JValue art::interpreter::ExecuteGotoImpl(art::Thread*, art::MethodHelper&, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue)+36319)
-I/DEBUG   ( 1368):     #15 pc 00251756  /system/lib/libart.so (art::interpreter::EnterInterpreterFromStub(art::Thread*, art::MethodHelper&, art::DexFile::CodeItem const*, art::ShadowFrame&)+166)
-I/DEBUG   ( 1368):     #16 pc 004a52d1  /system/lib/libart.so (artQuickToInterpreterBridge+737)
-I/DEBUG   ( 1368):     #17 pc 000d2b12  /system/lib/libart.so (art_quick_to_interpreter_bridge+34)
-I/DEBUG   ( 1368):     #18 pc 00e9251b  /data/dalvik-cache/x86/system@framework@boot.oat
-
-
+1. [其一:文件准备](doc/1.md) +2. [其二:SIF 客户端修改](doc/2.md) +2. [其三:AS 客户端修改](doc/3.md) +2. [其四:服务端部署](doc/4.md) +2. [其五:运行测试](doc/5.md) ## 特别感谢 -虹原翼 (yazawa@niconi.co.ni) @ [LLSIF 查卡器 + - 虹原翼 (yazawa@niconi.co.ni) @ [LLSIF 查卡器 ](https://card.niconi.co.ni/) 的技术支持。 - -## 一些截图 -
-展开查看 - - - -
+ - tungnotpunk @ LL Hax 在 iOS 客户端修改方面的支持。 + - reversing-sifas (https://github.com/Francesco149/reversing-sifas) 项目的灵感和技术细节。 + - LLAS WiKi (https://wiki.loveliv.es/) 提供的全量 AS Live Stage 信息。 + - 其他可能一时没想起来的大佬们和项目。 \ No newline at end of file diff --git a/certificate.crt b/certificate.crt new file mode 100644 index 0000000..9ed08c6 Binary files /dev/null and b/certificate.crt differ diff --git a/doc/1.md b/doc/1.md new file mode 100644 index 0000000..5e107fa --- /dev/null +++ b/doc/1.md @@ -0,0 +1,29 @@ +## 其一:文件准备 + +### 所需文件清单 + +1. 私服服务端 honoka-chan,也就是本项目以及运行所需的 Go 环境。 +2. 原始客户端,包含 SIF 和 AS 两个游戏,以及相应的 Android 和 iOS 两个平台,根据自己需求决定。 +3. 原始全量数据包,同上。 +4. Git,用于同步程序更新。 +5. \[Android only] Java JRE (JDK) 提供 keytool,用于生成客户端签名所需要的 keystore 文件。 +6. \[Android only] Apktool,用于拆封安卓客户端。 +7. \[Android only] Android SDK 提供 apksigner,用于签名 apk 文件。 +8. \[iOS only] 爱思助手等提供 IPA 签名功能的工具以及自己的苹果账号。 +9. \[iOS only] HxD Hex Editor,用于修改 iOS 客户端。 +10. 一台电脑以及手机用来干上面的活。 + +### 下载地址 + +Linux 系统直接用包管理工具安装即可,以下为 Windows 用户需要的下载地址。 + + - Go: https://go.dev/dl/ + - Git for Windows: https://github.com/git-for-windows/git/releases + - JRE (JDK): https://www.java.com/download/ie_manual.jsp + - Apktool: https://ibotpeaches.github.io/Apktool/install/ + - Android SDK: 由于 Android SDK 官方未提供单独的下载地址,可以使用 Android Studio 下载或者第三方网站下载(安全未知),例如 https://androidsdkmanager.azurewebsites.net/Buildtools + - HxD Hex Editor: https://mh-nexus.de/en/downloads.php?product=HxD20 + - SIF 客户端: https://0w-my.sharepoint.com/:f:/g/personal/smallfish_hualuoo_com/Ejt_D76BTa9No_JlqwjgpxABHCCV7py25BX0-dD56BN4KQ ,感谢虹原翼大佬提供,两个日文名的是日服的客户端可不管。 + - AS 客户端: https://mega.nz/folder/FtBxSZbR#7JZ0QuX_zdv-WFypIK0Vuw + - SIF 全量数据: 同 SIF 客户端下载地址。zhuabao.zip 中的 list_CN_Android 和 list_CN_iOS。 + - AS 全量数据: 待补充。关服前可自行抓包获取 `/asset/getPackUrl` 返回的下载地址集合,或者后续我会上传到网盘上。 diff --git a/doc/2.md b/doc/2.md new file mode 100644 index 0000000..3a92bcf --- /dev/null +++ b/doc/2.md @@ -0,0 +1,112 @@ +## 其二:SIF 客户端修改 + +SIF 客户端修改分为 Android 和 iOS 两个平台。 + +### 生成 RSA 密钥对 + +本程序已提供了一对 RSA 密钥,如果有需要自己生成的话,可以直接调用程序中的 `encrypt/rsa.go` 中的 `RSA_Gen` 函数生成,注意长度要用 1024。官方用的是 1024,太长的话 iOS 客户端进行 Hex 替换的时候会被截断。 + +### 生成 apk 签名用的 keystore + +使用命令 `keytool -genkeypair -v -keystore sifkey.keystore -alias sifkey -keyalg RSA -keysize 2048 -validity 36500` 生成 keystore,密码自己设置,其他信息可以都默认回车即可。 + +生成的 `sifkey.keystore` 就是我们需要的。 + +### SIF 客户端修改(Android) + +因为盛趣在原有日服客户端基础上,外面又套了一层自家的账号验证接口(手机号登录之类的)。所以客户端修改分为三个部分: +1. 盛趣相关接口地址的替换 +2. 客户端公钥的替换 +3. 客户端请求接口的替换 + +#### 盛趣相关接口地址的替换 + +使用 Apktool 反编译 apk 后,在 smali 代码里搜索 `sdo.com` 关键字,将地址替换成服务器的 IP 地址或者域名。 + +参考修改:https://github.com/YumeMichi/llsif-cn-client/commit/c8dba0c2ad5d274f5d0d8e346808a1b006d137ba + +注意:使用 sed 替换可能会导致重新打包后的 apk 文件无法使用,暂时不知道是什么原因,可能需要手动改过去。 + +#### 客户端公钥的替换 + +原本这步是应该替换 so 库里的公钥的,但是因为 SIF 有好几个不同架构的库你可能都要改一遍,所以还是直接在 Java 代码里写死吧嗯~ o(* ̄▽ ̄*)o + +参考修改:https://github.com/YumeMichi/llsif-cn-client/commit/4b36dd48b26467b4dd1e1f479540645788c58f9a + +#### 客户端请求接口的替换 + +SIF 的接口地址是写在数据包里,数据包又是经过加密。 + +1. 在 Apktool 解包目录下找到 `assets/AppAssets.zip`,解压到临时目录中 +2. 使用 [honky-py](https://github.com/DarkEnergyProcessor/honky-py) 将解压出来的 `config/server_info.json` 解密出来 +3. 修改解密后的 `server_info.json`,将其中的 `prod.game1.ll.sdo.com` 替换成服务器 IP 或者域名 +4. 使用 [honky-py](https://github.com/DarkEnergyProcessor/honky-py) 将修改后的 `server_info.json` 重新加密 +5. 将解压后的文件重新打包为 `assets/AppAssets.zip` +6. 更新 `assets/version` 文件中的 MD5 值 + +修改完最后通过 Apktool 重新打包成 apk 文件,然后使用 `apksigner sign --ks sifkey.keystore --ks-key-alias sifkey --out signed.apk unsigned.apk` 签名,使用前面生成的 keystore。 + +### SIF 客户端修改(iOS) + +iOS 客户端需要替换的东西跟 Android 客户端差不多,只不过位置不一样以及修改方式不一样。包含以下几个部分: +1. 盛趣相关接口地址的替换 +2. 客户端公钥和证书的替换 +3. 客户端请求接口的替换 + +#### 盛趣相关接口地址的替换 + +先将 ipa 文件作为 zip 解压,进入 `Payload\Love Live!.app` 目录,找到 `Frameworks\ghome_sdk.framework\ghome_sdk` 文件,拖入 HxD Hex Editor。 + +搜索 `mgame.sdo.com`,替换成服务器 IP 或者域名。***这里有个坑,替换的 IP 或者域名长度必须和原来的一致,短了填 0 直接炸。不知道什么原因~*** + +#### 客户端公钥和证书的替换 + +在 Android 客户端中,盛趣接口通信所使用的 RSA 公钥是通过 `/basic/publickey` 接口获取的,在 iOS 客户端中则是写死的,这也是为什么前文生成 RSA 密钥对的时候要使用 1024 长度的原因。 + +由于 iOS 客户端使用的都是 RSA 公钥证书,不是 Android 客户端中使用的 RSA 普通公钥,所以需要使用 RSA 私钥生成一个 RSA 公钥证书文件和相应的 base64。 + +使用的命令如下: +```bash +openssl req -new -x509 -key privatekey.pem -sha1 -out ca.crt -days 36500 # 信息可以填一下或者全部回车 +openssl req -new -key privatekey.pem -sha1 -out server.csr # 同上 +openssl x509 -req -days 36500 -in server.csr -CA ca.crt -CAkey privatekey.pem -CAcreateserial -sha1 -out server.crt +``` + +其中 `server.crt` 就是需要的文件。打开可以发现里面也是一串 bas64。删掉头尾的 `-----BEGIN CERTIFICATE-----` 和 `-----END CERTIFICATE-----` 仅保留中间的 base64 部分,将回车符号去掉后备用。 + +回来继续修改上文中的 `ghome_sdk` 文件,就在上文搜索的 `handshake` 接口下面就是写死的盛趣接口通信用的公钥证书的 base64,长度有十六进制 384(也就是十进制 900)。使用 `A` 填充生成的 server.crt 到 900 长度,例如 `...OSn+C3wAAAAAAAA...AAAAAAAA==`,然后替换掉原先的 base64。 + +接下来还需要替换游戏通信接口所使用的公钥,也就是 Android 客户端那节中的公钥,只不过 iOS 上换成了公钥证书(不是 base64)。 + +生成公钥证书只需要将上面的 base64 decode 出来即可。因为 decode 出来不是可读文本,所以还是用程序处理吧。示例代码: +```golang + b, err := base64.StdEncoding.DecodeString(utils.ReadAllText("server.crt")) + if err != nil { + panic(err) + } + utils.WriteAllText("certificate.crt", string(b)) +``` + +生成的 `certificate.crt` 就是需要的公钥证书,将该文件拖入 HxD Hex Editor。 + +接下来进入 `Payload\Love Live!.app` 目录,找到 `Love Live!` 文件,拖入 HxD Hex Editor。 + +搜索关键字 `Shanghai`,很容易定位到证书位置。选中证书范围,长度十六进制 33A(也就是十进制 826),不放心可以保存选区为 `crt` 文件,然后在 Windows 上可以直接双击打开,没问题的话会显示证书信息。 + +确认我们生成的证书 `certificate.crt` 长度没有超过 33A(肯定不会超过),将 `certificate.crt` 内容全选后覆盖 `Love Live!` 中相应长度的数据,不足 33A 的部分选择后填充 0 即可。 + +![原始证书](images/20230624174049.jpg) + +![自签证书](images/20230624181952.jpg) + +![不足的部分补零](images/20230624182015.jpg) + +#### 客户端请求接口的替换 + +iOS 客户端也是修改 `server_info.json`,进入 `Payload\Love Live!.app\ProjectResources\config`,将其中的 `server_info.json` 解密后替换 `prod.game1.ll.sdo.com` 为你的服务器 IP 或者域名,再加密后替换掉该文件即可。 + +最后将修改完的整个 `Payload` 目录打包成 zip 文件,然后扩展名改成 ipa。打开爱思助手,在工具箱里找到 `IPA 签名`,添加 IPA 文件,选择 `使用 Apple ID 签名`,登录自己的苹果账号,开始签名。 + +最后打开存储目录,将生成的 ipa 文件拖入爱思助手安装到手机(平板上)。 + +安装后的应用无法直接打开,需要到 `系统设置 - 通用 - VPN 与设备管理`,在 `开发者 APP` 下将账号设置信任后才可以运行。另外,个人苹果账号签名有效期只有 7 天,所以 7 天后需要再重新签名安装。 diff --git a/doc/3.md b/doc/3.md new file mode 100644 index 0000000..14807f2 --- /dev/null +++ b/doc/3.md @@ -0,0 +1,45 @@ +## 其三:AS 客户端修改 + +AS 客户端修改同样分为 Android 和 iOS 两个平台。 + +### AS 客户端修改(Android) + +Android 客户端修改,分为两个部分: +1. 盛趣相关接口地址的替换 +2. 客户端公钥和请求地址的替换 + +#### 盛趣相关接口地址的替换 + +参考 [其二:SIF 客户端修改](./2.md) 中的相关部分,完全一样。 + +#### 客户端公钥和请求地址的替换 + +由于 AS 使用的是 Unity 引擎,所以相关的信息都存放在 `assets\bin\Data\Managed\Metadata\global-metadata.dat` 中,在上述步骤 Apktool 解包后的目录下找到该文件,使用 [MetaDataStringEditor](https://github.com/JeremieCHN/MetaDataStringEditor) 打开该文件。 + +在搜索栏里输入 `/ep` 定位到 `https://prod-llas.jijiagames.com/ep3071`,将该地址修改为你的服务器 IP 或者域名。注意如果你的服务器不支持 https,请改成 http。 + +![](./images/20230624200603.jpg) + +继续搜索 `RSAKeyValue` 定位到 `...AQAB`。此处为客户端通信所使用的公钥,格式为 XML,我们本地生成的 base64 需要经过转换后方可使用。 + +![](./images/20230624202154.jpg) + +打开 [RSAKeyConverter](https://raskeyconverter.azurewebsites.net/PemToXml) 网站,将 base64 格式的公钥复制粘贴进去,转换成 XML 格式后,替换上面搜索出来的值。 + +![](./images/20230624201042.jpg) + +最后点击另存为,保存为新的文件。替换 `assets\bin\Data\Managed\Metadata\global-metadata.dat` 后重新打包并签名即可。详细打包签名过程参考 [其二:SIF 客户端修改](./2.md) 中的相关部分。 + +### AS 客户端修改(iOS) + +iOS 客户端修改,分为两个部分: +1. 盛趣相关接口地址的替换 +2. 客户端公钥和请求地址的替换 + +#### 盛趣相关接口地址的替换 + +参考 [其二:SIF 客户端修改](./2.md) 中的相关部分,完全一样。 + +#### 客户端公钥和请求地址的替换 + +参考上文 Android 修改方式,完全一样。`global-metadata.dat` 在 `Payload\llas.app\Data\Managed\Metadata` 目录下,修改替换完,重新打包签名即可。详细打包签名过程参考 [其二:SIF 客户端修改](./2.md) 中的相关部分。 diff --git a/doc/4.md b/doc/4.md new file mode 100644 index 0000000..88dff25 --- /dev/null +++ b/doc/4.md @@ -0,0 +1,33 @@ +## 其三:服务端部署 + +### 主程序部署 + +首先确认已经安装了 Go 环境以及 Git 工具,然后 `git clone https://github.com/YumeMichi/honoka-chan` 到你需要托管的服务器或者本地。 + +进入 `honoka-chan` 文件夹,执行 `go build` 编译,会自动下载依赖。 + +编译完成运行 `honoka-chan.exe` 即可,Linux 上可执行文件为 `honoka-chan`。 + +### 下载服务部署 + +分为 SIF 和 AS。 + +#### SIF 数据下载服务 + +下载 [其一:文件准备](./1.md) 篇中的全量数据,解压出 `list_CN_iOS` 和 `list_CN_Android` 两个文件夹。 + +在本程序目录下的 `static` 目录下新建 `Android` 和 `iOS` 两个文件夹,然后将上面解压的两个文件夹按照对应系统移动到新建的这两个文件夹里,并将 `list_CN_iOS` 和 `list_CN_Android` 都改名为 `archives`。最后目录结构为 `static\iOS\archives` 和 `static\Android\archives`。 + +由于数据包中也包含了盛趣服务器地址,所以为了不再次修改游戏配置文件,可以通过添加一个数据包,其中包含了修改过的服务器地址,并使其最后一个下载,这样会覆盖盛趣的服务器地址。 + +这里以 iOS 为例,进入 `static\iOS\archives`,可以发现 `99` 的数据包最后一个为 `99_0_114.zip`。复制 `99_0_113.zip` 为 `99_0_115.zip`,打开压缩包,删除没用 `client_info.json`,然后将 `server_info.json` 解压出来。 + +按照 [其二:客户端修改](./2.md) 中同样的方法解密文件、修改地址、重新加密后替换压缩包内的文件即可。 + +Android 也是同样的操作。 + +如果要将数据下载服务托管到云服务器,将 `static\Android` 和 `static\iOS` 这两个目录都上传到云服务器,然后自行建个 http 服务器即可,这里就不赘述了。 + +#### AS 数据下载服务 + +目前用的官方下载资源,无需其他设置,后续会进行更新。 diff --git a/doc/5.md b/doc/5.md new file mode 100644 index 0000000..47685e3 --- /dev/null +++ b/doc/5.md @@ -0,0 +1,25 @@ +## 其四:运行测试 + +如果前面的操作都没问题的话,服务端已经可以使用。 + +### SIF 测试 + +启动游戏,查看 `honoka-chan` 窗口输出。 + +登录方式为手机号密码登录,都可以随便输。第一次使用的手机号会自动生成账号并记住登录的密码,以及后续的游戏内设置都会保存。 + +按照提示下载数据,确认下载正常。 + +下载完毕可以进入游戏。 + +### AS 测试 + +AS 和 SIF 公用一套账号系统,所以可以直接用上面的账号密码登录。 + +按照提示下载数据,确认下载正常。 + +下载完毕可以进入游戏。 + +### 补充 + +SIF 的全量数据下载实际上并不是全量,部分剧情还是需要调用 `/download/getUrl` 接口下载指定的文件。所以还需要维护一份 zip 全部解压后的数据,这部分内容后面再补充吧~ diff --git a/doc/images/20230624174049.jpg b/doc/images/20230624174049.jpg new file mode 100644 index 0000000..634defa Binary files /dev/null and b/doc/images/20230624174049.jpg differ diff --git a/doc/images/20230624181952.jpg b/doc/images/20230624181952.jpg new file mode 100644 index 0000000..8c6ccec Binary files /dev/null and b/doc/images/20230624181952.jpg differ diff --git a/doc/images/20230624182015.jpg b/doc/images/20230624182015.jpg new file mode 100644 index 0000000..1d0ea5d Binary files /dev/null and b/doc/images/20230624182015.jpg differ diff --git a/doc/images/20230624200603.jpg b/doc/images/20230624200603.jpg new file mode 100644 index 0000000..ce63a1d Binary files /dev/null and b/doc/images/20230624200603.jpg differ diff --git a/doc/images/20230624201042.jpg b/doc/images/20230624201042.jpg new file mode 100644 index 0000000..62c08fe Binary files /dev/null and b/doc/images/20230624201042.jpg differ diff --git a/doc/images/20230624202154.jpg b/doc/images/20230624202154.jpg new file mode 100644 index 0000000..0e860de Binary files /dev/null and b/doc/images/20230624202154.jpg differ diff --git a/server.crt b/server.crt new file mode 100644 index 0000000..42ee7e4 --- /dev/null +++ b/server.crt @@ -0,0 +1 @@ +MIICNDCCAZ0CFGzDWCd7H88jGmU+PUtcg7inm6csMA0GCSqGSIb3DQEBBQUAMFkxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwIU2hhbmdoYWkxETAPBgNVBAoMCExvdmVMaXZlMREwDwYDVQQLDAhMb3ZlTGl2ZTAeFw0yMzA0MjIwOTE4MjhaFw0zMzA0MTkwOTE4MjhaMFkxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwIU2hhbmdoYWkxETAPBgNVBAoMCExvdmVMaXZlMREwDwYDVQQLDAhMb3ZlTGl2ZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1r6QjkBr1hIGrgq95ZEEDnXqCYa+81hvhejsGoUcfCZ/kkngBuUbq8/rqRfoFVEZOmDRG8DKrhtfFoWQyftqycCrQj8ELQeGCQJFtdXg+eljb3HDP8Zzzh+9YXJHNIswCYfMFYXlBHP90QniFfZqfERVSqK9V1uJU8EyxHMismUCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCP4A39w9Ah12OUwjn0IpkvF9XV5d3y8ca2AW+DbO2uL7Cdat/QNqKxdWLccnVoCd6eKCkL34e5y/+Ap2kVdh0NXpnZh0gD8Q1U1oRVPZeVw4aDc0LssksG7jG7UZHccOR9C9iPc/KZt0nOCfef2dBPODktszwR9zK8FszOSn+C3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== \ No newline at end of file