【探究】提前安装3.8?原神有可能提前安装预下载文件来更新到新版本吗

- 一个稍微懂一点的外行来点评一下这条路到底走不走得通:
- 首先,评论区已经有很多大佬点出来了,直接解压是不行的,它类似于一种 diff 的形式(与之相对的是原神的 hdiff),需要使用特殊的 patch 工具。但游戏仍能正常打开,因为只有单文件较大的音频包与视频包需要 hdiff,其他直接覆盖是没有问题的。
- 那么欺骗时间到底做不做得到呢?实际上是做不到的。那个停服维护的 note 只是给你看的,实际在 mhy 的服务器上并没有设定几点开服。也就是说,只要 mhy 的人没有把 stopServerConfig 删掉,就算你真的把 mhy 服务器时间改掉也不会开服。。。
2.那么有没有其他的方式呢?
- 实际上游戏登录分两层:dispatch 和真正的游戏服务器(gateserver,或者也可以是一个反向代理)。dispatch 就是管分发,管选服和游戏内小更新,以及 gateserver 的分配。那么显然可以想到自己搓一个 dispatch 服务器,然后将客户端导到真正的游戏服务器。但这个时候小更新都没有推出来,大概不会告诉你可连接的服务器地址的。
- 那么更新中(当天 6:00-11:00)可以吗?这个时候服务器是一定会发回小更新与服务器地址的(后者其实是因为原神自己 cur 解析的缺陷,没有服务器地址会提示二级地址解析失败)。但是答案仍然是不行。你仍可以连接到服务器,gateserver 会接受你的 kcp 连接,但是不会放你进去——服务器在你登录时会向一个内部 API 发送一个鉴权请求,包含你的账户信息以及版本等等,同时 mhy 自己带一个类似白名单的东西可以放测试人员进服。服务器可能会发送一个带非零 retcode 的 GetPlayerTokenRsp 把你挡在门外,也有可能根本不回你等你超时。
上面都是理论部分,有兴趣的朋友可以看下实际的技术需求:
- 插播一条广告:一个小工具,可以用原神的预下载包进行 hdiff 更新:https://github.com/YYHEggEgg/HappyGenyuanImsactUpdate/releases
- 手搓 dispatch 需要开发一个小型 http 服务器。这其实不难,随便哪种语言网上都能找到大量实现(至少可以实现绑定到一个 url 终结点,返回一个固定字符串)。
- 至少需要使用一个代理(Fiddler 即可)篡改 query_cur_region 的服务器(域名 cngfdispatch.yuanshen.com) 。原神的 cur 是一个 protobuf 数据类型并经过 RSA 加密;于今天而言 RSA Patch 也是大部分人这条路上最大的拦路虎。
- 它使用非对称加密来验证 cur 是否被篡改,因此如果想要篡改 cur 的内容,必须自己生成一对密钥对修改过的 cur 进行签名,并使用 RSA Patch 使得客户端信任它。
- RSAPatch 的早期版本本人并没有试过是否今天仍然有效,但如果使用网上找到的 RSAPatch 版本,建议使用 Grasscutter 的 signing_key,有无数的私服工作者帮你做各种适配版本,能省去很多麻烦。
- 另外,RSA 公钥加密最大 256 个字节,因此加密大数据需将数据切割成 256 一组,加密后再拼接起来 base64,变成 cur json中的 content,解密反过来即可;sign 则是将完整的内容使用 SHA256WithRSA 私钥签名,自己解密的时候就不需要验签了。
- 推荐一下自己的笔记:https://github.com/YYHEggEgg/GIUserAssemblyHelper/blob/main/Tutorial_CN.md#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E8%A1%A5%E4%B8%81-ua ,更详细地讲解了 cur RSA 加密的一套逻辑。(其中关于 UserAssembly 的内容自 3.3 起失效)
5.跨过 RSA 这道坎解出内容就容易了。使用 protobuf 格式 decode cur 内容,把 stopServerInfo 删掉,encode 回去,再走一遍 RSA 加密就可以达成目的。cur 使用的 proto(QueryCurrRegionHttpRsp.proto)网上很容易找到,把前面这一串拖到百度大概率都能搜到。(但是最好不要在你退出后出现在b站搜索框里面 :)
6.最终,你搭好了一个代理和一个仅会处理 cur 的服务器,游戏也使用了 RSAPatch 启动;如果你没有看到 4206 或是 4214,那么大概率你就能看到点击进入;然而你会被何种方式挡在门外就是未知的事情了。
顺便一提:
- 崩铁 1.0 的时候公布过一个“官服账号可通过特定违规操作登录b服”的 bug,我猜大概是相似的原理;虽然崩铁不上 RSA,但是每个版本 cur(那边叫做 query_gateway)的 proto 都换,因此其实实现难度比上文更高。
- 上面这些操作基本都可以产出一套专用的工具链——解 cur 的脚本,管 protobuf 的自动化程序,集成 Injector 的 RSA Patch 启动器,简易的 SDK 服务器;延伸一下还有类似 MagicSniffer 的抓包工具等。手里只要有了这些东西就非常容易,反之就相当于不可做。
- 看到这个视频不知不觉就唠了这么多,up 主或者路人看个乐就好~