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、GamePlayItemsGridTotalBlockCount、ExitedBlockCountSetTotalBlockCountFromLevelConfig、AddBlockCountCheckBlockCountAndLevelWinGetBlockCountOfDoor、GetAbleToExitBlockCountOfDoorGetClickableBlockPieceItemsDownloadAndPersistLevelConfigModelsToResourcesGetRegularLevelConfigModel、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.comhttps://block-out-be-admin-dev.grandgamesbe.comhttps://block-out-be-admin-dev.grandgamesbe.com/v0/pace_analyzerhttps://d2mr6ug912w3oh.cloudfront.net/https://grand.gs/privacyhttps://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 导出的 Unity2021.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 不受此结论影响。
- 当前结论均为静态分析,没有把网络访问、关卡配置下载或具体方法行为表述为已运行验证。