Files

Block Out! APK 静态逆向报告

【事实】样本身份

  • 应用:Block Out! - Color Sort Puzzle
  • 包名:com.grandgames.catblockjam
  • 开发商标识:Grand Games A.Ş. / Grand Games
  • 版本名、版本号:1145
  • minSdk=26,targetSdk=36
  • 主 APK SHA-256:ea7d5b421832b276ed0d021430984014530c72e5426dc83939569fc27d0164bb
  • ARM64 分包 SHA-256:9bce3ed566b7adfbda0cf278b3749d0cab243323774066647fbb7aeedb3909ee
  • REA 完整检查了主 APK 的 3910 个 ZIP 条目,未发现清单完整性冲突。REA Evidence:ev_04134250e39cd02f6225387fed601d4bc72f48b1b8c6f67f4acff08dc5d8b12e、ev_4ffb7acca276a2ee309deb0999b45bf5c580f1515d07b573347604358b05514f。

【事实】技术栈与保护形态

  • 引擎:Unity 2021.3.57f2。
  • 脚本后端:IL2CPP。代码主体为 ARM64 libil2cpp.so,托管类型元数据为 global-metadata.dat。
  • libil2cpp.so 是已剥离符号的 AArch64 ELF,共 80,528,824 字节;入口地址 0xcc04c0。REA Evidence:ev_664754cfa0040e2687abba2926c94ae266962fbabaa0daf76e534d63847c6d95、ev_bd1c8e4a45d8c3b290ad39d42fe1ffe85a48f711b21f0e46e4dbd11e02bae694。
  • 元数据头魔数为标准 IL2CPP AF 1B B1 FA,元数据版本字段为 31。
  • 主包有 9 个 DEX、2140 个 assets 条目、1577 个 res 条目;ARM64 分包含 24 个 .so。
  • 启动 Activity:com.unity3d.player.UnityPlayerActivity。
  • 构建场景:ApplicationScene、HomeScene、GamePlayScene。

【事实】游戏代码结构

静态元数据中可确认以下自有模块:

  • 棋盘:Modules.Contexts.GamePlay.Board.Scripts
  • 关卡生成:Modules.Contexts.GamePlay.Generation.Scripts
  • 输入:Modules.Contexts.GamePlay.Input
  • 关卡状态:Modules.Contexts.GamePlay.Levels
  • 序列化:Modules.Contexts.GamePlay.Serialization.Scripts
  • 教程、UI、重试、失败、胜利、卡死检测、续玩和道具均有独立模块。

可确认的核心对象和方法名包括:

  • BlockPieceItem、BoardPositionManager、GamePlayItemsGrid
  • TotalBlockCount、ExitedBlockCount
  • SetTotalBlockCountFromLevelConfig、AddBlockCount
  • CheckBlockCountAndLevelWin
  • GetBlockCountOfDoor、GetAbleToExitBlockCountOfDoor
  • GetClickableBlockPieceItems
  • DownloadAndPersistLevelConfigModelsToResources
  • GetRegularLevelConfigModel、GetArenaInitialLevelConfigModel、GetArenaLoopLevelConfigModel

可确认的障碍/组件命名包括:

  • 方块障碍:Arrow、Connected、Duration、Ice、Layer、LayeredIce、Lock、MovingIce、StackedLayer、Star。
  • 门障碍:IceDoor、Star、TurnBasedDoor。
  • 棋盘组件:Box、Cell、ColorCell、ColorCurtainLock、ColorGrinder、ColorInnerWall、CurtainLock、Elevator、Generator、Grinder、InnerWall、Ivy、Wall。
  • 道具/能力:Undo、Shuffle、Rocket、Bomb、Broom、PreBooster。

【观点】核心玩法逻辑推断

  • 胜利条件很可能以“已离开棋盘的方块数”与“关卡方块总数”比较为核心,因为同时存在 TotalBlockCount、ExitedBlockCount 与 CheckBlockCountAndLevelWin。
  • 方块是否可点击、占据哪个 BoardPosition、对应哪扇门,以及该门当前能通过多少方块,是移动/出场判定的重要输入。
  • 关卡配置不完全固化在 APK 内:代码明确包含后端关卡配置名、下载并持久化配置、远程配置与本地 fallback。
  • 上述是基于类型名、字段名和方法名的静态推断,不等于已还原方法体,也不等于运行时验证。

【事实】网络、商业化与分析组件

已确认程序集或组件包括:

  • Firebase Analytics、Crashlytics、Remote Config、App Check
  • Adjust
  • AppLovin MAX、Google Mobile Ads、Unity Ads
  • Facebook SDK / Audience Network
  • Vungle、BidMachine、MBridge、Pangle 相关原生库
  • Unity IAP、Google Play Billing
  • Metica SDK

静态字符串中出现以下项目相关地址:

  • https://block-out-collection.grandgamesbe.com
  • https://block-out-be-admin-dev.grandgamesbe.com
  • https://block-out-be-admin-dev.grandgamesbe.com/v0/pace_analyzer
  • https://d2mr6ug912w3oh.cloudfront.net/
  • https://grand.gs/privacy
  • https://grand.gs/terms

地址出现在包内不证明当前生产流程一定会访问它们;需要抓包或运行时调用证据确认。

【事实】权限

安装包声明了网络、网络状态、Wi-Fi 状态、震动、唤醒锁、通知、精确闹钟、前台服务、广告归因/广告 ID/Topics/Custom Audience、查询全部应用,以及旧版外部存储读写权限。模拟器当前未授予旧版外部存储读写权限。

【事实】当前产物

  • unpacked/base/:主 APK 完整解包,3909 个文件,约 438 MB。
  • unpacked/arm64_split/:ARM64 分包完整解包,29 个文件,约 104 MB。
  • il2cpp/libil2cpp.so:IL2CPP ARM64 原生代码。
  • il2cpp/global-metadata.dat:IL2CPP 类型与字符串元数据。
  • il2cpp/global-metadata.strings.txt:从元数据提取的 140690 行字符串索引。
  • il2cpp/ScriptingAssemblies.json:程序集清单。
  • il2cpp/RuntimeInitializeOnLoads.json:运行时初始化入口清单。
  • assetripper_export/unity_project/ExportedProject/:AssetRipper 2.0.0 导出的 Unity 2021.3.57f2 工程,约 898 MB。
  • 导出过程完整处理了 8777/8777 个资产,并生成 ApplicationScene、HomeScene、GamePlayScene 三个场景。
  • 已导出 460 个 Texture2D、约 5393 个 Sprite 资产文件、394 个 Prefab、55 个 OGG,以及大量材质、动画和关卡 JSON。
  • BlockOutReplica/Assets/Resources/OriginalLevel1/:已接入当前复刻工程使用的原始图集及红/绿/青/白/黑积木和四向出口精灵。

【事实】第 1 关解析

  • t140-level-1.json、t141-level-1.json、t142-level-1.json、t238-level-1.json 内容完全相同,SHA-256 均为 5b23937f89860d60aba191763e848ac1c1d28a24c7f335ea097f7edf0d5b5771。
  • 该关包含 3 个方块、3 个出口、18 个外墙单元和 25 个可用棋盘格。
  • 三个方块均为 2×2:颜色编号分别为 0、10、11;位置分别为 (3..4,6..7)、(6..7,6..7)、(6..7,9..10)。
  • 三个出口分别位于上边 (3..4,11)、下边 (6..7,5)、左边 (2,6..7)。
  • 结合模拟器同一状态画面可对应为:0=红色、10=白色、11=黑色。
  • t160-level-1.json 是另一套含 27 个方块、9 个出口及多种机制的复杂关卡,不能作为当前模拟器首关。
  • 原版积木由 CommonNineSliceAtlas 的九宫格精灵拼成,不是纯色立方体;红、白、黑角块的图集平均色和精灵命名均已核对。

【事实】Unity 复刻框架进度

  • 复刻工程已拆分为 Domain、Infrastructure、Gameplay、Presentation 四个运行时层,场景继续通过稳定入口 BlockOutPrototype 启动。
  • 首关不再硬编码方块和出口位置:OriginalLevelJsonParser 会从原版 JSON 解析方块、出口、墙、有效棋盘格和原始颜色编号。
  • LevelViewFactory 已使用解析模型生成关卡,并接入原版红、绿、青、白、黑积木与四向出口 Sprite。
  • 已将导出的 1199 个本地关卡 JSON 接入 Resources/OriginalLevels/;关卡仓库按系列和数字排序,可用界面按钮或左右方向键前后切换。
  • 五色的基础 1–9 号九宫格 Sprite 已接入,并按方块格子的上下左右邻接关系逐格选择。
  • Unity 2022.3.62f3c1 完成脚本编译和冷启动;已实际切换并加载 t140-level-1 与 t140-level-2,最新运行日志分别记录 3/3/25/18 与 8/5/35/18(方块/出口/格子/墙)。
  • 当前实现暂按 2=绿色、7=青色 映射;图集颜色与命名已核对,但尚未用原版第二关同状态画面最终确认编号对应关系。
  • 当前架构与事实/推断边界见 BlockOutReplica/Docs/REPLICA_ARCHITECTURE.md。

【事实】尚未完成与原因

  • 未生成可编译 C# 源码、DummyDll 或完整方法地址映射。
  • REA 的 Android 反编译接口缺少调用方提供的 jadx-headless-mcp 0.7.1。
  • 本机仍未发现可用的 JADX、apktool、Ghidra、Il2CppDumper 或 Cpp2IL;AssetRipper 2.0.0 已补充并成功完成资源导出。
  • libil2cpp.so 已剥离符号;资源导出不等于恢复原始 C# 方法体。
  • AssetRipper 无法从 IL2CPP 包恢复 MonoBehaviour 的字段布局,因此部分 ScriptableObject/Prefab 的自定义脚本字段为空;原始贴图、Sprite 几何、场景层级、标准 Unity 组件及关卡 JSON 不受此结论影响。
  • 当前结论均为静态分析,没有把网络访问、关卡配置下载或具体方法行为表述为已运行验证。