逆向总览 · 1.12.0.zip · 2026-10-20

Frost Valley 逆向总览

Unity IL2CPP 合成 + 章节式家园修复游戏。本页汇总 7 份专题笔记的主线:启动流程、玩法循环、配置数值、加密协议,以及还没解决的问题。全部来自静态分析,没有运行过游戏。

包名
com.liteorange.hometopia
版本
1.12.0 (1120000)
引擎
Unity 2022.3.62f2c1
脚本后端
IL2CPP · metadata v31.1
SDK 平台
途游 Tuyoo · AppLovin MAX
SDK
min 24 · target 36
观察 有地址或文件作为直接证据 推断 由证据推出 未解决 仍需代码或运行时验证
分析进度

做到了哪一步

阶段方法结果状态
C# 结构恢复Cpp2IL 导出签名与 ISIL135,486 个方法 · 11,232 个类型文件完成
子系统梳理5 个专题并行分析笔记 01–05完成
配置表解码M1 XOR → LZ4 → MessagePack,按 C# Key 还原字段名291 / 291 张表,0 个未映射字段完成
关键函数反编译Ghidra 12.1.4,套用 13.1 万个方法名和 2.1 万个字符串字面量笔记 07:加密、扣费、发奖、访客判定完成
全量伪 C2.88 万个游戏函数批量反编译,按精确边界和 noreturn 修正28,787 个函数 · 失败 1 个 · 77MB完成
运行时验证Frida / 真机存档还没做未开始
分层架构

从 Java 层到业务代码

业务代码拆在约 40 个自研程序集里。Assembly-CSharp 只放了 Bootstrap 等少数类。蓝框是游戏自研部分。

玩法层家园 · 合成 · 活动
BlueMergeHomeBlueStory*BlueMergeGameMergeGameCoreMergeMiniGameBlueHomeMergeBridgeActivityBaseActivity (33)ActivityMergeGame
业务服务账号 · 商业化
Account / CloudSaveShop · IAP · IAPBannerAd / CmpServiceUserGroupUserProfileInboxGacha
框架层BlueCore.Runtime
LauncherUIMgrFlowMgrStorageConfigAssetMgrBinaryHandler M1–M5ReporterConfigMeta (291 表)MergeEncrpy
C# SDK 桥接途游 · Google · Firebase
com.tuyoo.unitysdkTuyoo.ABTestTuyoo.Koilab.FvFirebase.*Unity.Notifications
第三方运行库
YooAssetUniTaskMessagePackDOTweenSpineTMPURPObfuz (几乎未生效)
Java / 原生层
Tuyoo GameSDKBilling 9.0.0AdBox → MAX 13.6.3AppsFlyer 6.17.4ONNX Runtimelibnicai (DES)FFmpeg
启动时序 · Launcher 依赖层级

12 个启动模块

MergeLauncher.AddLaunchModules @0x30eb3fc 注册 12 个模块,Launcher 按依赖做拓扑排序,就绪的模块并发初始化。下面每行是一个依赖层级。

  1. DebugEnvChoose release 包中为空实现
  2. BasicMgr 服务器时间同步
  3. UserInfo · GdprLauncher · YooAsset 本地存储与用户信息 / GDPR 与 TCF 同意 / 资源包
  4. YooGa · ThirdSdk 途游 SDK 初始化、登录、GameServer / Firebase
  5. Config 291 张表:CDN latest.txt + cfg_N.bytes,失败用内置 message_bytes;AB 覆盖
  6. UserGroup 按充值和激励视频频次分群
  7. IAP ShopService 与恢复购买
  8. MAX 广告 SDK 与 CMP
  9. OtherMgr UI、货币、语言、卡册、邮件等业务服务,注册 33 个活动

全部成功后加载 GameScene。TestHome.RunStartupAsync 关闭加载界面:第一章前三个建造点没完成就直接进剧情,否则进家园。家园和合成在同一个场景内切换。

核心循环

体力 → 合成 → 金币 → 建造 → 等级

合成 · CorePlay
  • 7 × 9 棋盘,物品 = 链 + 等级
  • 双击生成器耗体力出棋子
  • 同链同级合成后升一级,并解开相邻障碍
→ 交订单拿金币
订单
  • 托盘策略填单,有每日上限
  • 金币 = 订单内棋子 Price 之和,无倍率
  • 同时发活动积分和卡包
→ 金币回到家园
家园剧情
  • 91 个故事 ID、190 个场景
  • 建造点花金币,然后播动画和对话
  • 等级只靠建造提升
→ 解锁新链和活动
LiveOps · 商业化
  • 33 个活动,28 天循环
  • 122 个 IAP SKU
  • 激励视频按用户分群调整
→ 补体力、加速
数值要点 · 包内默认配置

体力与产出

耗体力 = BasicEnergyConsume << (倍率档位 − 1) // GetEnergyConsume @0x2f27670 倍率档位 1 / 2 / 3 / 4 → ×1 / ×2 / ×4 / ×8
项目值来源表
体力上限 / 恢复100 · 每 120 秒 +1MergeEnergyConfig_Main
体力倍率解锁×2 16 级 · ×4 30 级 · ×8 30 级(需 400 体力)MergeEnergyConfig_EnergyBoost
生成器大多每次 1 体力,有次数上限和冷却MergeChessConfig_MergeChessGeneratorInfo
剧情建造1,163 个建造点 · 共 371,722 金币StoryStrategy_LTProgress
等级200 级;剧情全部建完约到 85 级MergeLevelConfig_LevelCostReward
钻石档位$1.99 – $99.99(gem100 – gem7450)IAPInfo_PurchaseInfo
广告插屏和开屏在默认配置里关闭;分群 1/2 关掉全部激励位AdConfig_*

线上值可能被 CDN 下发的配置或 AB 实验覆盖,下载到线上配置后可以用同一个解码脚本处理。

加密与存档 · 已反编译确认

五种处理算法和两个协议

对象算法密钥来源证据
M1 Handler循环 XOR:out[i] = in[i] ^ key[i % n]调用方传入ProcessDataSafe @0x2e98f2c 观察
M2 HandlerAES-128-CBC / PKCS7,密文前 16 字节是 IVSHA256(key)[0:16]GenerateAesKey @0x2e993f4 观察
内置配置M1 → Lz4BlockArray → MessagePackRemoteConfigMeta.Extra291 张表 MD5 校验通过 观察
访客配置v_cfg 用 M2,v_rule 用 M1Extra / 字面量 "v_rule"两者都已解开 观察
本地存档MessagePack LogData,Content 用 M1新档 Flag=1, Extra="None"需用真机存档验证 推断
GameServerAES-256-CBC,IV = key[0:16];16 字节随机前缀 + 大端长度 + JSON,按 32 字节补齐后 Base64metadata 中两个 32 字节数组逐字节异或笔记 07 §3;请求没有签名 观察
YooAsset bundle只在文件头加了 12 字节 0x00 偏移,没有加密无三个包抽样都是 12×00 + UnityFS 观察
访客模式

部分设备会拿到另一套配置

VisitorHandler 按 v_rule 的 11 条规则依次判定,第一条命中即生效:白名单判为正常用户,黑名单判为访客,全都不命中判为正常用户。结果会持久化,只算一次。

规则类型默认启用
device_id 白名单(179 个)· IP 白名单(4 个)· 设备名白名单 · debug 包white是
device_id / IP 黑名单(当前为空)black是
中国区域 · 中文系统语言black是
无 SIM · 非 Google Play 安装 · 已 rootblack否

被判为访客后,会用 v_cfg 给 8 张表打稀疏补丁,并跳过远端配置和 AB。列表表按主键替换对应行,Main 表只覆盖 MainMap 里列出的字段。实际效果:关闭 FlamingFrenzy 活动、资产气泡激励位、推送、评分弹窗、剧情对话和立绘;开启序章;第 3–7 级的金币和经验门槛调高(例如第 6 级金币从 244 提到 480)。活动总开关和首启视频不变。推断 这是给审核人员或中国区设备看的简化版本。

横切机制

多个系统共用的部分

机制实现
弹窗与流程UIMgr 弹窗栈加上 FlowMgr:首页约 26 个单元,合成局内约 50 个,按优先级串行执行
资源YooAsset 三个包。剧情包只内置第一章,其余约 1.79GB;活动包 1,091 个 bundle,内置 303 个,开启前 48 小时内预下载
云存档GameServer tuyoo_client:user/bind、hall、fkworld get/set_game_data
掉落调控Koilab FV:ONNX 双头模型给"留存"和"看广告"打分,决定生成器下一个产出(包内默认关闭)
埋点Reporter 走途游 GA 主通道,另有 AppsFlyer、Firebase、Koi 阈值事件
混淆Obfuz 运行时已装,但名称都保留,业务代码里没有加密调用
关键发现

值得关注的点

内购只在服务端校验

客户端验签失败只上报,照样本地发货。恢复购买走游戏服务器邮件,不查询 Google。

包里写死了密钥

AB SecretKey、FV AccessKey(HMAC)、MAX sdk key 和 GameServer AES 密钥都在包里。笔记只记录前几个字节。

用机器学习调控掉落

生成器的产出由模型按留存和看广告倾向打分决定,lucky 目标率 0.02,支持本地和云端推理。

活动完全本地运行

活动代码里没有网络请求,排行榜和竞速对手都是本地机器人。

审核态配置

中国区或中文设备默认判为访客,会关掉一个活动、广告气泡、推送、评分和剧情对话,早期升级也更慢。

未解决问题

还需要验证的

问题状态下一步
线上配置与 AB 实际取值未解决拿到 CDN 下发的 cfg_N.bytes 后用 decode_config.py 解码
存档是否就是 XOR "None"推断用真机 All.main.bin 验证
服务端收据校验未解决静态分析看不到,需要观察网络流量
Koilab FV 线上开关与 WebSocket 协议部分包内默认关闭,需要 AB 数据
产物位置

文件在哪里

内容路径(相对 merge2/)
专题笔记 00–07notes/
C# 签名 / ISILextracted/cs/ · extracted/isil/
配置 JSON(291 张表)extracted/config/tables/
访客规则与配置extracted/config/v_rule.decoded.json · v_cfg.tables.json
Ghidra 工程(已套符号)ghidra_proj/
伪 C(游戏自研程序集)extracted/pseudo_c/
脚本scripts/cfg/ · scripts/ghidra/ · scripts/strlit/