若我们在 PlayStation 主机使用中国大陆账号下载《原神》,并在切换至非中国大陆地区的 PSN 用户后尝试游玩,则会收到「无法登录服务器」(4204)的「网络错误」提示。但是,既然此「错误」与 PSN 账户区域有关,则显然是人为施加的限制所致。
自然,我们应当猜测,存在从网络请求方面修改以绕过此限制的可能。本文就此给出示例。
分析
首先,我们应当查询并分析网络请求/响应记录以确定游戏客户端如何在启动时进行网络验证,乃至产生此错误。复现上述网络错误并在同时查询产生的网络请求日志,观测到客户端向 https://dispatchcnglobal.yuanshen.com:443 发出请求。
提示: 有关如何在 PlayStation 主机上分析网络请求,请见本文「分析和修改来自 PlayStation 主机的网络请求」小节。
对上述请求通过中间人攻击(MitM/Man-in-the-middle attack)解密可得其 HTTPS 请求数据。带有参数的请求完整 URL 为:
1 | https://dispatchcnglobal.yuanshen.com/query_region_list?version=CNRELPS53.5.0&lang=2&platform=8&binary=1&psn_region=hk&time=273&channel_id=1&sub_channel_id=0 |
此请求中意义较为明确的参数如下表所示。
| 参数名 | 参数值 |
|---|---|
| version | CNRELPS53.5.0 |
| platform | 8 |
| psn_region | hk |
使用浏览器访问测试可得,若将参数 psn_region 的值改为 cn,则请求结果改变。我们猜测,在此请求返回正确的「region list」后,游戏客户端现在应该已能正常载入。
修改请求
接下来,我们应当尝试实际修改 PlayStation 主机上的请求响应来验证。
提示: 有关如何修改来自 PlayStation 主机的网络请求,请见本文下一小节。
对于本文所需达成的目标,只需修改参数 psn_region,而不应修改其他参数。因此,在编写的脚本中,可以使用以下正则表达式来判定是否修改请求:
1 | https:\/\/dispatchcnglobal\.yuanshen\.com\/query_region_list\?.*psn_region=.* |
对于满足条件请求,则可以使用正则表达式 /(psn_region=)[^&]+/ 作为模式以替换 psn_region 参数值。
修改生效后,再次使用 PlayStation 主机启动游戏,此时已可以正常登入游戏并绑定 PSN 与米哈游账户。
分析和修改来自 PlayStation 主机的网络请求
PlayStation 并不向用户提供能够分析网络的开发者工具,但仍有数种方法通过 PlayStation 主机所连接至的网络上游设备(网关或路由器等)进行数据分析和修改。
我的家庭网络环境使用 Surge 作为网关,利用其相关功能是我能对 PlayStation 主机网络进行调试的最简方法,本文便以此为例。
Surge 是什么?
Surge for Mac 是一个运行于 macOS,能够充当代理服务器的 HTTP 调试/开发工具程序。该程序的一个用法便是运行于家庭网关,处理进出的网络流量。分析
使用作为网关的 Surge 的「控制器」或「Web Dashboard」,在正确配置 MitM 和 HTTP 内容截取后,应当很容易便能从其「最近请求」页面中捕获 PlayStation 主机发起的相关请求及细节,本文不再详细讨论。

修改
利用 Surge 所提供的功能,有数种方法能够按照前文所述完成对请求的修改。 例如,Surge 的脚本功能就能直接修改 HTTP 请求和响应。
对于此修改,只需创建一个「HTTP Request」类型脚本。

关于 URL 正则表达式,请见本文「修改请求」小节。
Surge JavaScript 脚本内容如下方代码所示。
1 | $done({url: $request.url.replace(/(psn_region=)[^&]+/, `$1cn`)}); |
未尽事宜
显然,这个方法所能解决的问题很可能不尽于此。《原神》在中国地区开设了多组独立的服务器,若阁下所游玩的服务器在本文的讨论范围之外,由于上述对于服务器信息的请求中还有众多其他参数,应当也存在能够在 PlayStation 上游玩的可能。限于我并无法访问相关运行环境,本文无法提供进一步的信息。若阁下有相关需求,则请自行在相关环境下进行网络分析。
声明
本文所提供的信息仅供技术交流和研究使用,不应被用于任何违反当地法律法规的行为。任何人在使用本文所提供的信息时应当自行承担风险,并遵守当地的法律法规。本文作者不对任何人因使用本文所提供的信息而产生的任何损失或法律责任承担任何责任。