vaiserYT/GRET

GitHub: vaiserYT/GRET

GRET 是一个 GameMaker 游戏的终端逆向分析工具包,通过解析 data.win 文件并构建依赖关系图来揭示游戏的内部结构与隐藏内容。

Stars: 0 | Forks: 0

# GRET **GameMaker 逆向工程工具包** [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](pyproject.toml) GRET 是一个用于 GameMaker 游戏的静态分析工具包。它解析 `data.win` 二进制文件,解析内部引用,构建依赖关系图,并提供查询接口以理解游戏内部机制。专为需要在未运行游戏的情况下了解 GameMaker 游戏运行方式的研究人员、Modder 和开发者设计。 ## 功能 **当前功能** - 完整的 `data.win` 二进制解析器,支持所有主要 chunk(OBJT、ROOM、SPRT、SOND、STRG、CODE、FUNC、VARI、FONT、TMLN、PATH、SHDR、SEQU、BGND、DAFL、SCPT) - 包含交叉引用的对象、房间、精灵图、声音和代码条目的资源数据库 - GMS2.3 事件解析 —— 正确处理带有 56 字节动作结构的两级指针列表事件格式 - 引用解析器 —— 将每个 CODE 条目映射到其所属的对象、脚本、房间或全局函数 - 调用图 —— 包含所有脚本/函数调用关系并去重边的有向图 - 房间图 —— 基于对象实例共享推导出的房间连通性 - 对象图 —— 继承链、房间放置、实例关系和精灵图使用情况 - 字节码解码器 —— GML 字节码的指令级反编译 - 隐藏内容发现 —— 检测未使用的房间、死对象、孤立的对话和可疑资源 - 标志位引用追踪 —— 识别整个代码库中标志位变量的读取和写入 - 字符串引用追踪 —— 将每个字符串字面量映射到其调用者 - 交互式 CLI —— 实时查询和探索游戏 - 富终端输出 —— 通过 `rich` 库实现格式化的表格、树形结构和颜色编码的结果 ## 理念 GRET 不是一个 GameMaker 编辑器。它不会修改 `data.win`,不会将脚本反编译为可编辑的源码,也不会重新构建资源。 GRET 是一个逆向工程工具包。它的目的是通过揭示结构、依赖关系和隐藏内容,帮助你理解 GameMaker 游戏的运行机制。如果 UndertaleModTool 回答了“这是什么资源?”,那么 GRET 回答的则是“这个资源为什么存在,谁在使用它,如果我移除它会怎样?” ## 安装 要求 Python 3.12 或更高版本。 ``` pip install -r requirements.txt ``` 或者使用 pip 安装: ``` pip install . ``` 依赖项:`networkx`(图)、`orjson`(快速 JSON)、`rich`(终端 UI)、`jinja2`(报告模板)、`graphviz`(可选,用于图导出)。 ## 快速开始 ``` python cli.py path/to/data.win ``` GRET 会加载游戏,解析所有 chunk,解析交叉引用,并打开一个交互式 shell: ``` Loaded 1733 objects, 252 rooms, 0 scripts, 8522 sprites, 764 sounds, 93214 strings + 209 functions, 38069 variables, 18025 code entries, 0 texture pages Building graphs... Ready for queries. ╭────────────────────────────────────────────╮ │ GameMaker Reverse Engineering Toolkit │ │ Type 'help' for commands, 'quit' to exit. │ ╰────────────────────────────────────────────╯ gm> ``` 你也可以非交互式地运行命令: ``` python cli.py path/to/data.win summary python cli.py path/to/data.win why obj_ch5_LW21 python cli.py path/to/data.win room room_town_north ``` ## CLI 命令 | 命令 | 描述 | |---|---| | `summary` | 显示资源汇总数量 | | `graph` | 显示图统计信息(房间、调用、对象) | | `why ` | 解释对象为何存在 —— 它被放置在哪里,谁创建了它,什么引用了它 | | `trace ` | 跨所有资源类型追踪名称或模式 | | `who_uses ` | 列出所有按名称引用该资源的代码条目 | | `flag ` | 显示哪些代码条目读取或写入特定的标志位变量 | | `room ` | 显示房间详情、实例放置和过渡 | | `unreachable` | 枚举无法到达的房间、未使用的对话和死对象 | | `secret` | 对可疑/隐藏资源进行评分并列出 | | `search ` | 按子字符串搜索所有资源名称 | | `debug_resolver` | 运行完整的交叉引用验证器 | | `debug_graph` | 运行完整的图一致性验证器 | | `debug_chunks` | 运行完整的二进制解析器验证器 | | `help` | 显示命令参考 | | `quit` | 退出 shell | ## 示例 ### 对象为何存在? ``` gm> why obj_ch5_LW21 Object: obj_ch5_LW21 (id=1421) Sprite: spr_lw_21_far Parent: obj_ch5_room Depth: 100, Persistent: False Placed in rooms: - room_ch5_lw_21 (248, 240) - room_ch5_lw_21_b (256, 12) Created dynamically by: - obj_ch5_game.event_0_0 Events: 3 - event[0](0) - event[3](0) - event[3](2) Referenced by: sprite, room x2, parent ``` ### 房间详情 ``` gm> room room_town_north Room: room_town_north Size: 960x832, Speed: 30 Persistent: True, Reachable: True Views: 8, Backgrounds: 1 Instances (42): - obj_player @ (480, 720) (creation code) - obj_door_entrance @ (480, 800) - obj_npc_shopkeeper @ (280, 640) ... ``` ### 隐藏内容发现 ``` gm> secret Hidden Resources / Secrets (184 total) ┏━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┃Score┃ Type ┃ Name ┃ Reasons ┃ Details┃ ┡━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ │ 12 │ room │ room_dw_secret_boss │ unreachable, special │ boss_… │ │ 10 │ object │ obj_secret_door │ unreachable │ │ │ 9 │ sprite │ spr_ending_epilogue │ unused │ 528×… │ │ 8 │ string │ "DebugTeleport" │ code reference only │ │ └─────┴───────┴─────────────────────────┴──────────────────────┴───────┘ ``` ### 图统计信息 ``` gm> graph Graph Statistics: Room graph: 252 nodes, 1644 edges, 189 components Call graph: 18025 nodes, 11133 edges Object graph: 15108 nodes Unreachable rooms: 18 ``` ## 架构 GRET 通过多层结构处理游戏: ``` data.win │ ▼ Binary Parser ─── reads all chunks (OBJT, ROOM, CODE, SPRT, …) │ outputs typed model objects ▼ Intermediate Representation (IR) ─── model objects with resolved numeric IDs │ ▼ Reference Resolver ─── maps every CODE entry to its owner │ builds bidirectional cross-reference indexes ▼ Graph Builder ─── constructs three directed graphs: │ call graph (code → code), │ room graph (room → room), │ object graph (room → instance → object → parent → sprite) ▼ Query Engine ─── high-level API over resolver + graphs │ why, trace, who_uses, search, secret, unreachable ▼ Analyzers ─── specialized analysis modules: │ dead code, flags, dialogue, transitions, hidden resources ▼ CLI / REST API / Browser UI ``` **二进制解析器** (`binary/`):独立解析每个 chunk。每个 chunk 都有一个专用的解析器(`objt.py`、`sprt.py`、`sond.py`、`room.py` 等),用于生成类型化的 dataclass 模型对象。`DataWinReader` 提供对文件的直接内存映射访问。 **中间表示** (`model/`):所有解析出的资源都存储为 Python dataclass。对象、房间、精灵图、声音、代码条目、函数和变量都是普通数据,没有未解析的 ID。 **引用解析器** (`ir/resolver.py`):根据每个 CODE 条目的命名约定(`gml_Object_*`、`gml_Script_*`、`gml_GlobalScript_*`、`gml_Room*`)对其进行分类,将事件代码映射到其所属的对象,并跨所有资源类型构建双向查找表。 **图构建器** (`ir/graph.py`):生成三个 `networkx.DiGraph` 实例。调用图编码了每个 caller→callee 关系。房间图连接了共享对象实例的房间。对象图编码了继承、放置和资源使用情况。 **查询引擎** (`query/engine.py`):提供 CLI 使用的高级查询 API。像 `why` 和 `secret` 这样的命令将解析器、图和分析器中的信息聚合到单个响应中。 **分析器** (`analysis/`, `analyzers/`):用于检测秘密内容、分析对话引用和生成报告的专用模块。 ## 为什么选择 GRET? UndertaleModTool 是 GameMaker 二进制编辑和反编译的标准工具。GRET 并不打算与它竞争。 GRET 专注于另一个问题:大规模的语义分析。当你需要了解数百个对象和数千个代码条目之间是如何相互关联的——谁调用了谁、哪些房间是可达的、什么代码引用了特定的精灵图、哪些标志位被读取但从未被写入——GRET 能在几秒钟内给出答案。 UTMT 回答“这是什么?” GRET 回答“它连接到了什么,谁依赖它,如果它改变了会破坏什么?” 这两个工具相互补充。使用 UTMT 进行编辑和反编译。当你需要映射整个游戏的依赖关系图并追踪跨越其边界的逻辑流时,请使用 GRET。 ## 路线图 - [x] 用于所有主要 `data.win` chunk 的二进制解析器(GMS2.3 格式) - [x] 带有类型化模型对象的中间表示 - [x] 具有完整交叉引用索引的引用解析器 - [x] 具有指令级分析的字节码解码器 - [x] 调用图生成(去重边) - [x] 房间图生成(带有共享对象回退) - [x] 对象图生成(继承、放置、资源使用) - [x] 隐藏内容发现(秘密查找器) - [x] 带有富终端输出的交互式 CLI - [x] 全面的验证套件 - [ ] 版本差异引擎(比较不同构建版本间的资源) - [ ] 秘密分析器 2.0(基于模式的启发式评分) - [ ] 浏览器 UI(基于图的资源浏览器) - [ ] REST API(查询引擎的 HTTP 接口) - [ ] 插件 SDK(无需修改核心即可自定义分析器) - [ ] 图可视化(导出为 Graphviz / 交互式 HTML) ## 许可证 MIT GRET 面向希望从结构层面理解 GameMaker 游戏的研究人员、Modder 和逆向工程师。它着眼于整个游戏,而不仅仅是单个资源,并提出那些编辑器不会提出的问题。
标签:GameMaker, Python, 云安全监控, 云资产清单, 无后门, 游戏模组, 特权检测, 逆向工具, 逆向工程, 静态分析