战舰少女反和谐技术分析

相信很多老提督都知道 http://discord.cnnblike.com:3000/WSGun.pac 这个网址吧。只要用了这个网址,就可以修复大破立绘和船名称出错的问题。但是这其中的原理是什么,这个网址是否安全?那么我们就要扒开来看一看了。

代理式反和谐的一般方法

反和谐的第一种方法(来自百度贴吧)

值得注意的是,有的地方第四点写的是“改不改回去随便”,这是一种错误的做法。如果没有改回去,在运行战舰少女时你的所有网路通信都会经过代理服务器。对于自己,不仅会降低游戏的网络连接速度,也会带来账号被盗的风险。对于代理服务器的提供者,这样产生了大量的流量,甚至导致服务器负载过高而不可用。

代理式反和谐的特殊方法

  • 下载 release.zip
  • 解压,双击 main.exe
  • 用“一般方法”中1的方法,“高级选项——代理”设置为“手动”,服务器地址输入电脑的IP(确保电脑和手机在同一WIFI下)。端口为 9090
  • 接下来的方法同上 3,4

“代理式”反和谐的源头

我们已经看到“代理式”反和谐需要一个神秘的网址,那么我们去掉域名前缀看看:
大佬的博客首页

显然这是一个博客——应该是这个服务器主的。在博客底部,我发现了作者的邮箱。搜索这个邮箱,可以找到相关项目的介绍和 GitHub 链接。
大佬的相关帖子

程序解析

既然看到来自 GitHub,我对这个网址就八成放心了——为什么呢?

GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 git 作为唯一的版本库格式进行托管,故名 GitHub 。GitHub 于 2008 年 4 月 10 日正式上线,除了 git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过 350 万,托管版本数量也是非常之多,其中不乏知名开源项目 Ruby on Rails、jQuery、Python 等。作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。(摘自百度百科)

也就是说,GitHub 上所有的软件的代码,都是开诚布公的,如果作者藏着什么恶意代码,是很容易被发现的!

打开GitHub链接,作者有两个项目:

  • discord:在 iOS 上进行反和谐、登录 Android 服务器
  • discord-lite:新版,iOS、Android;官服、渠道服务通用

作者写lite版的目的也写清楚了
Commit Log from GitHub

(翻译:用 Go 语言全部重写,现在我们不必担心内存使用的问题,并且我们可以十分方便的把它在Windows和Linux操作系统上传播,不必担心邪恶的服务提供者之类的事)

程序代码很简单,略去了一些定义,直接解析核心代码。
代码解析——配置读取

稍有常识的人就知道,这是一个读取配置文件的代码(这么简单的程序居然还要配置文件?)大概就是寻找配置文件路径,读取,解析,done。

代码解析——URL匹配

这是一个辅助函数,用于检测 URL 是否是需要进行代理用于反和谐。循环,正则匹配,就酱。

代码解析——编译筛选器

辅助函数,用于编译筛选器(筛选器是什么看配置文件解析一章)

代码解析——主函数
主函数。这是重点。

前面是创建代理服务器。

然后是重头戏:筛选网络通信流量,篡改返回结果,达成反和谐目的。

在下面没有截图,主要是为 PAC 文件提供 HTTP 访问。

配置文件解析 & 游戏更新机制

该程序共有 3 个配置文件

配置文件列表

时间关系我们直接看反和谐:

战舰少女反和谐的配置文件

comment 和 port 的含义已经在上面了。下面解释modifiers(修改器):

  • filter(筛选器):决定是否要篡改请求
    • host: 主机名,是一个正则表达式,其实就是version.jr.moefantasy.com(官服)和version.channel.jr.moefantasy.com(渠道服)。
    • url: 去掉主机名的地址。这里是游戏进行检查更新的一个API。
  • rules(规则):修改网络通信的规则
    • hook:在什么时候修改(在获得服务器响应时)
    • target:修改什么(舰R只要修改响应内容,少前既要修改响应头又要修改内容)
    • pattern:原文
    • replacement:修改后的文字

从上面的代码可以看出,游戏更新的地址是http://version.jr.moefantasy.com/index/checkVer。打开这个地址,返回的是如下信息:

{
"ResUrlWu": "",
"ResUrl": "",
"ResVersion": "",
"version": {
    "newVersionId": "2.0.0",                             //版本号
    "hasNewVersion": 1,                                  //是否有新版本(1=是,0=否,下同)
    "isMandatory": 1,                                    //是否强制更新
    "downloadUrl": "",                                   //下载地址
    "DataVersion": null,
    "ForceGz": null
},
"loginServer": "http:\/\/login.jianniang.com\/",        //登录服务器地址
"hmLoginServer": "",
"useHmSdk": 0,
"inviteCode": "",
"canOmitPhone": 0,
"canFastRegister": 0,
"cheatsCheck": 0,                //是否反和谐
"shipRenameCheck": 1,            //是否允许修改船名
"snowing": 3,
"RealNameCheck": 1,              //是否禁用动植物园
"OldRealNameCheck": 1,
"HeartBeatCheck": 0,             //疑似新卫星?
"HbTime": 300,
"DataVersion": null,
"ForceGz": null,
"gameNotice": "",
"gameNoticeUrl": ""
}

我通过“注释”的方式将信息的含义标在了对应行的后面。

结论

事实上,反和谐和和谐的资源都在游戏资源服务器上存着,只是有一个开关被关掉了。只要在版本更新的时候把cheatsCheck从 0 改为 1,就能反和谐了。