High School Fleet ハイフリ – 拆解相关

2022-12-03:

停服前资源汇总:https://pan.baidu.com/s/1eoeaeHBbgw8sHEhsrJVHag


五月的时候,偶然上服务器看了一次db更新的日志,才发现这游戏从3月份就停服了。这也太惨了,运营一年就没了。

正式停止服务是5/25,刚好还能获取资源,于是完全下载了全套assets,不多,也就单平台1.4g,但也不知道拿这个能做什么了。

R.I.P.


没错,我又在拆游戏了

昨天给 RayFirefist 下kr服bdr,下完后他说是继续去研究少鸽的资源加密了。然后我在商店里面点了下详情页,结果在相关里面看到了岬哥

目前还在摸索,不过初始进游戏开了个Liberty就绕过了检测,简单记录ida过程


先来个cri key

首先昨晚的时候就已经搜到过了,服务器域名是haifuri.app

所以白天开始分析之后就先在dump.cs里面搜索位置,域名配置位于Net命名空间Web类下。

分析完之前的也就只能搜到这个了,等了一个多小时分析完了之后,直接先去确认域名具体内容。查看set_ApiHost的调用在Web::SetAddress里面,共有6种域名,分别为 dev stg rev qa tmp1 prd,cdn除prd直接为prd-static.haifuri外,其他5个都有对应的随机串后缀。

(cdn是google cloud,神奇的是居然可以直连)

Web类下面还有set_Master,跟随调用来到MasterUpdater类的Download方法。为了先确定本地内容,找到Master类下的SaveLocalData,里面调用了Cipher::EncryptSaveData。

Cipher类有3个固定类成员password iv salt,在cctor里面可以看到有赋值操作,不过这个 RuntimeHelpers::InitializeArray 配合PrivateImplementation 刚开始把我给难住了。

搜索后知道了这个是内联字节数组的初始化过程,但我没找到数据在哪。

中午的时候拜托人编译了个空项目只初始化一个内联byte,才发现原来数据是放在metadata里面了。dump.cs 里面有offset我以为是主程序,还想着这里不是指令吗()

于是找到所有内容了:

password: savedata
iv: hex(1AF932518C58DCE9C2FA487EE96FB587)
salt: d1e95c245d961a35e3e354b73f3960de9a53a4b72197c53f9cfe7d3398f77eed

至于EncryptSaveData里面的操作,进去之后调用了Code::GenerateKeyPBKDF2(password, salt, 32, 32),PBKDF2是Rfc2898定义的 “基于密码的密钥导出函数2”,openssl有函数可以直接用。

简单复制一下代码,然后就找到master并且可以解密内容了


本地master确认了,然后就是确认master是怎么从服务器下下来的

这游戏绑定了证书,所以我ios12就没法抓包了。换到9的se上绑定hosts之后,就可以正常抓包了。

下载master的过程真是简单,/base/system在master版本落后的时候就会返回当前版本的MasterHash,MsgPack编码。看起来api上是没有加密的。

然后就是挨个下载,url组成是 /masters/{$item[‘Signature’]}.j

下载后和之前类似,依然是PBKDF2生成密钥,此处使用的密码是 nCG80L6W3FA3PdSv ,可以在MasterUpdater::Download里面找到,salt和iv则是在上面hash表中给出了。解密完之后的内容直接是个json字符串


接着就是素材了,下完master之后游戏直接下了 /assets/ios/201904122010/FileSystemOverrideRecords ,中间的版本号是从AssetVersions里面得到的,内容一看也是加密的。

因为一般来讲一个游戏都会使用同一个加解密模块,所以就在Code::Decrypt上面确认调用,翻到Database$$LoadRegistry,一看调用的还是Cipher类的常量,也就是说资源用的是和存档一样的(本来也是嘛,素材路径名就是用的EncryptSaveData)

把Records扔进DecryptSaveData后出来的数据是个1f8b,可还行。gzdecode之后就是manifest了

这个manifest有点意思的,同一url会包含多个素材,比如 char0010 包含了29个不同的AssetBundle。其他来讲就是Crypto为-1的时候继续用DecryptSaveData处理下载的数据,拼接url直接在版本号后面追加DownloadName

这次逆向基本就这些,等我有空了再写一个db diff

附加解密util

<?php

function GeneratePBKDF2Key($password, $salt) {
  return openssl_pbkdf2($password, $salt, 32, 32);
}
define("SAVEDATA_IV", hex2bin('1AF932518C58DCE9C2FA487EE96FB587'));
define('SAVEDATA_KEY', GeneratePBKDF2Key('savedata', 'd1e95c245d961a35e3e354b73f3960de9a53a4b72197c53f9cfe7d3398f77eed'));
define('MASTER_PASSWORD', 'nCG80L6W3FA3PdSv');

function EncryptSaveData($data) {
  return openssl_encrypt($data, 'AES-256-CBC', SAVEDATA_KEY, OPENSSL_RAW_DATA, SAVEDATA_IV);
}
function DecryptSaveData($data) {
  return openssl_decrypt($data, 'AES-256-CBC', SAVEDATA_KEY, OPENSSL_RAW_DATA, SAVEDATA_IV);
}

function EncryptMaster($data, $iv, $salt) {
  return openssl_encrypt($data, 'AES-256-CBC', GeneratePBKDF2Key(MASTER_PASSWORD, $salt), OPENSSL_RAW_DATA, hex2bin($iv));
}
function DecryptMaster($data, $iv, $salt) {
  return openssl_decrypt($data, 'AES-256-CBC', GeneratePBKDF2Key(MASTER_PASSWORD, $salt), OPENSSL_RAW_DATA, hex2bin($iv));
}

 

13 thoughts on “High School Fleet ハイフリ – 拆解相关”

  1. 想问下大佬魔劣的手游有兴趣弄下manifest吗?这个手游10月底就关服了。我想拆个卡面留作纪念(官网其实也有图就是,但是那个jpg被压得很惨,质量远不如直接拆出来的)。但是比较蛋疼的是官方没有内置的下载全部资源选项,有个get_master.json文件,我怀疑链接可能都在那里,但是被加密了。我自己折腾了好久没弄出来,所以想问下大佬有没有兴趣弄下?

        1. 粗略看了下, 这脚本貌似只下3d部分.
          你要全载版的话, 去问下作者愿不愿意弄了 #熊猫捂脸

      1. 恩,我其实主要是为了卡面。回头问问他看。这作者我还有点印象,之前tolove也是拿的他的脚本。不过我其实也有点好奇你前面说的那个幕后是什么来源的消息啊。。

        1. 好像是cgworld, 反正烂大街的开发情报。
          我前面的说法有些误导, 主要指拆游戏之前就得知3d主贴图512x , 实在不够看。 2d部分其实没有提。
          至于那位脚本作者, 也是个资深大佬了。

  2. 請問
    不知道大佬能不能幫我解密
    まいにちコンパイルハート的LIVE2D文件
    拜託你了> <

  3. 大佬我也想请教下楼上那个过SSL绑定的问题。想问下安卓下有解决方案吗?
    我之前搜索了不少东西,但是就算是Magisick+MagiskTrustUserCerts或者 Xposed + JustTrustMe 也没办法过。

    倒是有找到过一个frida的脚本可以过,但是本身完全不懂安卓代码,所以不知道怎么把这个脚本拦截的请求转发到fiddler里去。
    因此想请教下,安卓下有比较适合小白用的过SSL Pinning的办法吗

  4. “这游戏绑定了证书,所以我ios12就没法抓包了。换到9的se上绑定hosts之后,就可以正常抓包了。”
    你好,大神,请教下ios9,绑定hosts。这个具体怎么操作?或者提供下关键词我百度下,谢谢…

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax