「艦隊これくしょん」出于反 Bot 和未知目的,对游戏资源进行了不少混淆处理。
本文列举将会列举部分资源的混淆算法,并给出整理后的混淆算法或反混淆算法。
注意:此些算法都具有时效性,建议在使用前进行测试。
体例
Core.swf/common.util.SoundUtil/createFileName
:表示Core.swf
文件中的common.util.SoundUtil
类中的createFileName
函数。
Core.swf
Last Update: 2017-02-15
Core.swf 是游戏加载的第二个 swf 文件,由 mainD2.swf 读取、反混淆和加载运行。其反混淆函数为 mainD2.swf/mainD2/___
,该函数本身亦经过复杂的代码混淆。
反混淆算法原理:
- 将 Core.swf 的 0~127 bytes 划为第一区域,128~EOF 划为第二区域。
- 将第二区域按相等大小划分为 8 块,按 0, 7, 2, 5, 4, 3, 6, 1 的顺序重新排列。
反混淆脚本 Core-decode.py Core.swf Core-dec.swf
:
1 | #!/usr/bin/env python3 |
活动地图的 SP 部分
Last Update: 2017-02-15
角川于 2016 年秋活(2016-11)新增了达成一定条件后解锁新增海域路径的机制。
该机制原理为:
- 将新增的海域路径储存到额外的 SWF 文件中。
- 将该额外 SWF 文件使用 Core.swf 相同的算法混淆处理。
- 将混淆后的 SWF 文件作为二进制数据(Binary Data)嵌入到
/kcs/scenes/SallyMain.swf
中。
因此,只需要将 SallyMain.swf
嵌入的二进制文件保存为 SWF 文件,然后使用上述 Core-decode.py
即可反混淆。
活动地图的文件名 (swf)
Last Update: 2017-02-15
自 2016 年冬活(2016-02-10)起,角川对活动地图的 swf 文件名进行了混淆,但通常图的文件名仍然遵循 AA_BB.swf
的格式。其混淆函数位于 Core.swf/common.resources.MapResourceLoader/_convertName
。
该函数内 __loc10__:String
的值为一串正则表达式的结果,其值为 "push"
,这是该函数内唯一的代码混淆。
该混淆函数的本质是对 RND:Array
的解压缩算法,建议直接阅读下面的算法。
1 |
|
舰船语音的文件名 (mp3)
Last Update: 2016-03-17
角川于 2016 冬活结束的维护(2016-02-24)中,对所有舰船语音的文件名进行了混淆,但仍保留旧的文件(1~51.mp3
)。于 2016-02-29 的维护中,更改了混淆算法的 key 并删除了旧的文件,但没有修改混淆算法。
该混淆算法位于 Core.swf/common.util.SoundUtil/createFileName
。该算法极为简单,且算法本身未有任何混淆。
整理后的混淆算法:
1 | # vcKey is extracted from Core.swf/common.util.SoundUtil |
战果排名的战果值混淆
Last Update: 2016-08-01
角川于 2016-7-15 的维护更新中,对战果排名中的玩家战果值(api_rate
)进行了混淆。此次混淆对不同玩家采用了不同的混淆值,且算法本身亦经过一定规模的混淆。角川与 2016-8-1 的维护更新中,对战果 API URL 和其字段进行了混淆,同时小幅更新了战果值的混淆算法。
本文不涉及战果 API URL 和其字段的混淆分析,请参考其他信息。
此混淆算法涉及到四个文件:核心部分为 Core.swf/core.apis._APIBaseS_
和 RecoreMain.swf/scene.record.models.RankData/RankData
,次要部分为 RecordMain.swf/scene.record.models.RankingData/setData
和 RecordMain.swf/connection.api_req_ranking.RankingListAPI/_handleLoadComplete
。
因为角川几乎在每次游戏维护都会修改混淆算法的 key,因此以下算法仅供了解原理,请前往 poi 我变强了 查看最新的混淆 key。
1 | #!/usr/bin/env python3 |