Reorganize setup guides
- Move documentation from doc/ to docs/ with descriptive filenames - Rewrite and reflow the setup, client patching, deployment, and testing guides - Keep 99_0_115.zip deployment notes and update run.sh usage details Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# 文件准备
|
||||
|
||||
## 需要准备的内容
|
||||
|
||||
1. `honoka-chan` 服务端源码,以及运行所需的 Go 环境。
|
||||
2. 原始 SIF 客户端,按需准备 Android 和 iOS 版本。
|
||||
3. 原始 SIF 全量数据包。
|
||||
4. Git,用于同步项目更新。
|
||||
5. Android 平台额外需要:
|
||||
- Java JRE 或 JDK,提供 `keytool`
|
||||
- Apktool,用于拆包和回编译
|
||||
- Android SDK,提供 `apksigner`
|
||||
6. iOS 平台额外需要:
|
||||
- 爱思助手或其他支持 IPA 签名的工具
|
||||
- 自己的 Apple ID
|
||||
- HxD Hex Editor
|
||||
7. 一台用于处理文件的电脑,以及至少一台测试设备。
|
||||
|
||||
## 下载地址
|
||||
|
||||
Linux 用户一般可以直接通过包管理器安装相关工具。下面列出常用的 Windows 下载地址:
|
||||
|
||||
- Go: https://go.dev/dl/
|
||||
- Git for Windows: https://github.com/git-for-windows/git/releases
|
||||
- Java JRE / JDK: https://www.java.com/download/ie_manual.jsp
|
||||
- Apktool: https://ibotpeaches.github.io/Apktool/install/
|
||||
- Android SDK: 官方没有单独维护统一下载页,可以通过 Android Studio 安装,或者从直链下载,例如:
|
||||
https://dl.google.com/android/repository/build-tools_r37_windows.zip
|
||||
- HxD Hex Editor: https://mh-nexus.de/en/downloads.php?product=HxD20
|
||||
- SIF 客户端与全量数据:
|
||||
- 百度网盘: https://pan.baidu.com/s/1CRxw1JtEDRRzIxknXYMIaA?pwd=sif1
|
||||
提取码: `sif1`
|
||||
- SharePoint: https://mercari-my.sharepoint.com/:f:/g/personal/sakana_mercari_onmicrosoft_com/IgBUbQY4zT3oTZHSkULr3z6pAcfgK-k9OdvXTa8ZkqpoObY
|
||||
- 两个链接内容相同,任选其一即可
|
||||
- SIF 全量数据包使用其中的 `list_CN_Android` 和 `list_CN_iOS`
|
||||
@@ -0,0 +1,153 @@
|
||||
# 客户端修改
|
||||
|
||||
SIF 客户端修改分为 Android 和 iOS 两个平台。两边的目标基本一致:
|
||||
|
||||
1. 替换盛趣相关接口地址
|
||||
2. 替换客户端公钥或证书
|
||||
3. 替换客户端内置的游戏接口地址
|
||||
|
||||
## 生成 RSA 密钥对
|
||||
|
||||
项目里已经提供了一对 RSA 密钥。如果需要自行生成,可以调用 `encrypt/rsa.go` 中的 `RSA_Gen` 函数,长度必须使用 `1024`。
|
||||
|
||||
原因:
|
||||
|
||||
- 官方使用的就是 `1024`
|
||||
- iOS 客户端里有一部分证书内容是直接做 Hex 替换,长度过长会被截断
|
||||
|
||||
## 生成 Android 签名所需的 keystore
|
||||
|
||||
执行下面的命令生成 keystore:
|
||||
|
||||
```bash
|
||||
keytool -genkeypair -v -keystore sifkey.keystore -alias sifkey -keyalg RSA -keysize 2048 -validity 36500
|
||||
```
|
||||
|
||||
密码自行设置,其他信息可以直接回车。生成后的 `sifkey.keystore` 会在 Android 重新签名时使用。
|
||||
|
||||
## Android 客户端修改
|
||||
|
||||
### 1. 替换盛趣相关接口地址
|
||||
|
||||
使用 Apktool 反编译 APK 后,在 smali 代码里搜索 `sdo.com`,将地址替换成你的服务器 IP 或域名。
|
||||
|
||||
参考修改:
|
||||
https://github.com/YumeMichi/llsif-cn-client/commit/c8dba0c2ad5d274f5d0d8e346808a1b006d137ba
|
||||
|
||||
注意:
|
||||
|
||||
- 使用 `sed` 批量替换有概率导致重新打包后的 APK 无法使用
|
||||
- 如果出现问题,建议手动修改
|
||||
|
||||
### 2. 替换客户端公钥
|
||||
|
||||
理论上也可以直接替换 so 库里的公钥,但 SIF 有多套不同架构的 so,逐个修改比较麻烦,所以更简单的做法是直接在 Java 代码里写死。
|
||||
|
||||
参考修改:
|
||||
https://github.com/YumeMichi/llsif-cn-client/commit/4b36dd48b26467b4dd1e1f479540645788c58f9a
|
||||
|
||||
- [llsif-cn-client](https://github.com/YumeMichi/llsif-cn-client) 的文档中也有 so 库的 patch 方法供参考。
|
||||
|
||||
### 3. 替换客户端请求接口
|
||||
|
||||
SIF 的游戏接口地址写在数据包里,而数据包本身又经过加密。
|
||||
|
||||
处理步骤:
|
||||
|
||||
1. 在 Apktool 解包目录下找到 `assets/AppAssets.zip`,先解压到临时目录
|
||||
2. 使用 [libhonoka](https://github.com/DarkEnergyProcessor/libhonoka) 解密其中的 `config/server_info.json`
|
||||
3. 修改解密后的 `server_info.json`,把 `prod.game1.ll.sdo.com` 替换成你的服务器 IP 或域名
|
||||
4. 使用 [libhonoka](https://github.com/DarkEnergyProcessor/libhonoka) 重新加密修改后的 `server_info.json`
|
||||
5. 重新打包 `assets/AppAssets.zip`
|
||||
6. 更新 `assets/version` 文件里的 MD5 值
|
||||
|
||||
修改完成后重新用 Apktool 打包 APK,然后执行签名:
|
||||
|
||||
```bash
|
||||
apksigner sign --ks sifkey.keystore --ks-key-alias sifkey --out signed.apk unsigned.apk
|
||||
```
|
||||
|
||||
## iOS 客户端修改
|
||||
|
||||
iOS 客户端需要做的事情和 Android 大体相同,只是位置和修改方式不一样。
|
||||
|
||||
### 1. 替换盛趣相关接口地址
|
||||
|
||||
先把 IPA 当作 ZIP 解压,进入 `Payload\Love Live!.app`,找到 `Frameworks\ghome_sdk.framework\ghome_sdk`,用 HxD 打开。
|
||||
|
||||
搜索 `mgame.sdo.com`,替换成你的服务器 IP 或域名。
|
||||
|
||||
注意:
|
||||
|
||||
- 替换后的字符串长度必须和原始字符串一致
|
||||
- 长度不够时需要补 `0`
|
||||
- 这里长度不一致通常会直接导致客户端崩溃
|
||||
|
||||
### 2. 替换客户端公钥和证书
|
||||
|
||||
Android 客户端使用的是通过 `/basic/publickey` 获取的 RSA 公钥;iOS 客户端把通信证书写死在二进制里,所以除了私钥,还需要生成证书。
|
||||
|
||||
执行:
|
||||
|
||||
```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` 就是后面要用到的证书文件。打开后可以看到是一段 base64 文本,去掉:
|
||||
|
||||
- `-----BEGIN CERTIFICATE-----`
|
||||
- `-----END CERTIFICATE-----`
|
||||
|
||||
只保留中间内容,并去掉换行符备用。
|
||||
|
||||
接着继续修改 `ghome_sdk` 文件。搜索 `handshake` 附近,可以找到盛趣接口通信使用的证书 base64。该区域长度为十六进制 `384`,也就是十进制 `900`。
|
||||
|
||||
处理方式:
|
||||
|
||||
1. 将新生成的 `server.crt` 内容补足到 `900` 长度
|
||||
2. 不足部分用 `A` 填充
|
||||
3. 替换原始 base64
|
||||
|
||||
接下来还需要替换游戏通信使用的证书。iOS 这部分不是 base64,而是证书二进制内容。
|
||||
|
||||
可以先把上面的 base64 解码成证书文件,例如:
|
||||
|
||||
```go
|
||||
b, err := base64.StdEncoding.DecodeString(utils.ReadAllText("server.crt"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
utils.WriteAllText("certificate.crt", string(b))
|
||||
```
|
||||
|
||||
生成的 `certificate.crt` 就是目标证书。把它拖进 HxD,然后进入 `Payload\Love Live!.app`,打开 `Love Live!` 主程序文件。
|
||||
|
||||
搜索关键字 `Shanghai`,通常可以很快定位到证书位置。选中证书区域,长度为十六进制 `33A`,也就是十进制 `826`。如果不放心,可以先把选区保存成单独文件,双击确认它确实是一份证书。
|
||||
|
||||
替换时注意:
|
||||
|
||||
- `certificate.crt` 的长度不能超过 `33A`
|
||||
- 用新证书内容覆盖原区域
|
||||
- 不足部分补 `0`
|
||||
|
||||
示意图:
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
### 3. 替换客户端请求接口
|
||||
|
||||
iOS 端同样需要修改 `server_info.json`。进入 `Payload\Love Live!.app\ProjectResources\config`,解密 `server_info.json`,把 `prod.game1.ll.sdo.com` 替换成你的服务器 IP 或域名,然后重新加密并替换原文件。
|
||||
|
||||
处理完后把整个 `Payload` 目录重新打包成 zip,再把扩展名改回 `.ipa`。然后用爱思助手里的 `IPA 签名` 功能,选择 `使用 Apple ID 签名`,登录自己的账号后开始签名。
|
||||
|
||||
最后把签名后的 IPA 安装到设备。
|
||||
|
||||
安装后的应用默认无法直接打开,需要到:
|
||||
|
||||
`系统设置 -> 通用 -> VPN 与设备管理`
|
||||
|
||||
在 `开发者 App` 下信任对应账号后才能运行。个人 Apple ID 签名的有效期通常只有 7 天,到期后需要重新签名安装。
|
||||
@@ -0,0 +1,83 @@
|
||||
# 服务端部署
|
||||
|
||||
## 主程序部署
|
||||
|
||||
先确认已经安装 Go 和 Git,然后拉取项目:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/YumeMichi/honoka-chan
|
||||
cd honoka-chan
|
||||
```
|
||||
|
||||
编译:
|
||||
|
||||
```bash
|
||||
go build
|
||||
```
|
||||
|
||||
编译完成后,Windows 直接运行 `honoka-chan.exe`,Linux 运行 `./honoka-chan`。
|
||||
|
||||
## 使用 `run.sh` 管理进程
|
||||
|
||||
Linux 下如果希望常驻运行并方便管理,可以直接使用项目根目录的 `run.sh`:
|
||||
|
||||
```bash
|
||||
./run.sh start
|
||||
./run.sh stop
|
||||
./run.sh restart
|
||||
./run.sh status
|
||||
./run.sh logs
|
||||
```
|
||||
|
||||
当前行为:
|
||||
|
||||
- `start` 会以 `nohup` 后台运行 `honoka-chan`
|
||||
- 如果可执行文件不存在,会自动执行 `go build -o honoka-chan main.go`
|
||||
- PID 文件路径:`temp/run/honoka-chan.pid`
|
||||
- 日志文件路径:`temp/run/honoka-chan.log`
|
||||
- 每次启动都会覆盖旧日志
|
||||
|
||||
## 下载服务部署
|
||||
|
||||
### SIF 数据下载服务
|
||||
|
||||
先准备 [文件准备](./01-prerequisites.md) 里提到的 SIF 全量数据,并解压出:
|
||||
|
||||
- `list_CN_Android`
|
||||
- `list_CN_iOS`
|
||||
|
||||
然后在项目根目录下创建:
|
||||
|
||||
- `static/Android`
|
||||
- `static/iOS`
|
||||
|
||||
把两个目录分别移动进去,并统一改名为 `archives`。最终目录结构应为:
|
||||
|
||||
- `static/Android/archives`
|
||||
- `static/iOS/archives`
|
||||
|
||||
如果只打算支持一个平台,可以删除另一个平台的数据。
|
||||
|
||||
### 准备 `99_0_115.zip`
|
||||
|
||||
由于数据包中本身也包含盛趣服务器地址,所以为了不反复修改游戏配置文件,可以额外准备一个 `99_0_115.zip`,让它在更新时最后下载,从而覆盖原始地址。
|
||||
|
||||
以 iOS 为例:
|
||||
|
||||
1. 进入 `static/iOS/archives`
|
||||
2. 确认当前最后一个 `99` 包是 `99_0_114.zip`
|
||||
3. 复制 `99_0_113.zip` 为 `99_0_115.zip`
|
||||
4. 打开压缩包,删除没用的 `client_info.json`
|
||||
5. 解压出 `server_info.json`
|
||||
6. 按照 [客户端修改](./02-client-modification.md) 中相同的方法解密、修改、重新加密并放回压缩包
|
||||
|
||||
Android 同理。
|
||||
|
||||
### 托管方式
|
||||
|
||||
如果要把下载服务放到云服务器,只需要把:
|
||||
|
||||
- `static/Android`
|
||||
- `static/iOS`
|
||||
|
||||
上传到你的 HTTP 服务目录即可。具体 HTTP 服务搭建方式不在本文档展开。
|
||||
@@ -0,0 +1,33 @@
|
||||
# 运行测试
|
||||
|
||||
前面的步骤完成后,就可以开始联调。
|
||||
|
||||
## 配置文件检查
|
||||
|
||||
第一次启动 `honoka-chan` 后会生成 `config.json`。需要确认:
|
||||
|
||||
- `settings.cdn_server` 指向你的数据下载地址
|
||||
- 如果数据直接放在本项目的 `static` 目录下,通常可以配置成类似 `http://192.168.1.123/static`
|
||||
|
||||
如果 `cdn_server/{系统}/archives/99_0_115.zip` 存在,服务端会自动把它追加到更新下载列表;如果不存在,则会直接跳过。
|
||||
|
||||
## 登录与下载测试
|
||||
|
||||
客户端登录方式为 `手机号密码登录`。这里的手机号和密码都可以随便填写:
|
||||
|
||||
- 第一次使用的手机号会自动创建账号
|
||||
- 之后再次使用同一个手机号时,会沿用之前保存的密码和游戏内设置
|
||||
|
||||
进入游戏后,按提示下载数据,确认下载过程正常完成。
|
||||
|
||||
下载完成后即可进入游戏。
|
||||
|
||||
## 补充说明
|
||||
|
||||
SIF 的“全量数据下载”实际上并不是真正的全量。部分剧情资源仍然需要通过 `/download/getUrl` 接口按路径拉取。
|
||||
|
||||
所以除了 `archives` 目录里的压缩包,还需要另外维护一份:
|
||||
|
||||
- zip 全部解压后的资源目录
|
||||
|
||||
这部分内容后面再补充。
|
||||
@@ -0,0 +1,8 @@
|
||||
# 文档目录
|
||||
|
||||
建议按下面顺序阅读:
|
||||
|
||||
1. [文件准备](01-prerequisites.md)
|
||||
2. [客户端修改](02-client-modification.md)
|
||||
3. [服务端部署](03-server-deployment.md)
|
||||
4. [运行测试](04-testing.md)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 501 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 539 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 322 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 106 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 144 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 133 KiB |
Reference in New Issue
Block a user