一条命令把游戏还原成可编辑工程:Godot 反编译与 PCK 恢复完整上手指南
【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp
硬盘阵亡后,Godot 游戏只剩发给测试的 .pck 和 .apk——源码没了,包里只剩 .gdc 这种 GDScript 编译后的字节码文件。这正是 Godot RE Tools(gdsdecomp)存在的意义:把编译产物还原成能继续开发的工程,反编译脚本、恢复 project.godot、把导入资源转回原始格式。
快速定位
一句话:一套开源的 Godot 逆向工具集,同时覆盖 2.x、3.x、4.x 三代引擎,带独立 GUI 和命令行两种用法。
- 全项目恢复:从 APK、PCK 或内嵌包的 exe 里读资源、反编译全部 GDScript、重建 project.godot 与导入/插件配置
- 批量反编译:.gdc 字节码 → 可读的 .gd 源码(PCK 即 Godot 打包后的项目归档,.gdc 是其中编译后的脚本)
- 资源双向转换:.tscn/.tres 文本 ↔ .scn/.res 二进制互转
- PCK 归档操作:提取、创建、打补丁,还能把包嵌回 exe
适合谁:源码丢失要抢救项目的开发者、审计游戏网络/存档/内购逻辑的人、想拆解开源游戏的同学。不适合谁:指望 100% 还原注释和命名的人(产物只是逻辑等价骨架);GDNative/GDExtension 项目和 2.x 模型文件(dae/fbx/glb)官方尚未支持。
首次上手
- 获取工具:下载最新 release;Windows 用户也可走 Scoop:
scoop bucket add games scoop install gdsdecomp- 准备目标:任一个导出的 .pck、.apk 或内嵌包的 exe。GUI 里直接拖拽进窗口,或从文件浏览器选,三种格式都原生识别:
- 跑第一条核心命令:
gdre_tools --headless --recover=game.pck --output=recovered- 验收成果:输出目录里应有还原的 project.godot、.gd 脚本和文本化资源。恢复日志会同时报告它检测到的引擎版本——拿同版本 Godot 编辑器打开工程,能避开大半语法报错。
说白了:丢给它一个编译产物,还你一个能继续编辑的工程。
原理拆解
只记差异的字节码版本树
为什么需要:Godot 每个版本的字节码格式都有出入——token 编号会变、内置函数会增减、参数个数会调。用一个解析器硬啃所有版本必然处处翻车。
怎么实现:misc/bytecode_versions.json 登记了 59 个字节码版本,每条记录一个指向父版本的parent,以及added_tokens、removed_tokens、renamed_functions这类相对父版的增量差异。检测时先从文件头特征定位到最接近的版本(仓库 helpers/ 里还有一组按内置函数做特征探测的脚本,用来细分具体版本),再沿 parent 链回退补齐。版本定义还能通过--load-custom-bytecode从 JSON 热加载,新版本支持不用等发版。
每条版本只写"和爸爸差在哪",几十个 Godot 版本才能共享同一套解析逻辑。
token 流归一化 + 控制流回放
为什么需要:反编译器读到的是一串扁平 token,不是一行行缩进的 if/for。
怎么实现:bytecode/bytecode_base.h 里的GlobalToken枚举把各版本名字各异的 token 统一映射到一套全局语义(如G_TK_CF_IF、G_TK_OP_ASSIGN),解析器据此重建if、for、赋值等语法骨架,再查对应版本的函数表还原调用名和实参。所谓反编译,本质是拿状态机把执行轨迹倒着放一遍。
全局语义层 + 每版本差异表,是 2.x/3.x/4.x 三代引擎共用一套骨架的关键。
预留钥匙胚的解密接口
为什么需要:部分游戏不用 Godot 标准的 AES-256-CFB,自己滚了一套加密。
怎么实现:标准加密配--key(64 位十六进制串)即可;非标准方案则继承CustomDecryptor虚基类写一个 GDScript,重写_parse_and_decrypt完成自定义文件头解析和解密,返回含error/length/data的字典。官方文档 docs/custom_decryptors.md 给了解密文件结构、流程与标准算法示例脚本。
把解密逻辑做成可扩展接口,工具才能覆盖"每家游戏各加各的壳"的现实。
实战场景
场景一:加密包全量抢救
gdre_tools --headless --recover=game.apk \ --output=recovered \ --key=000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F \ --force-bytecode-version=4.3.0输出解读——恢复报告窗口是验收主战场:
Decompiled scripts/Failed scripts:成功与反编译失败的脚本数Successfully converted:资源转回导入格式的个数- 报告会写明建议用哪个 Godot 编辑器版本打开工程,照做即可
坑:--force-bytecode-version只在自动检测失败时用,硬塞错版本会让失败率飙升。
场景二:只抽脚本快速审计
gdre_tools --headless --recover=target.pck --scripts-only --output=audit输出解读:只拉脚本,秒级出结果,适合快速过一遍网络通信、存档加密、内购校验逻辑有没有洞。
坑:--scripts-only只出脚本,资源仍留在二进制形态,输出目录里别指望看到图片音频。
场景三:定向恢复与格式转换
gdre_tools --headless --recover=edu_game.pck \ --include="res://**/*.png" \ --include="res://**/*.tscn" \ --output=materials输出解读:glob 圈定只取要的东西,图片还原为原始导入格式,场景/资源从二进制转回 .tscn/.tres 文本,方便教学拆解和素材复用。
坑:包里存的是 .gdc 不是 .gd——--include="res://main.gd"不会命中任何文件;另外裸通配*.gdc会被当作递归模式(等价res://**/*.gdc)。
参数速查
| 策略 | 关键参数 | 适用场景 |
|---|---|---|
| 全量恢复 | --recover+--output | 源码丢失抢救、项目迁移 |
| 仅脚本 | --recover+--scripts-only | 逻辑速读、安全审计 |
| 定向恢复 | --include/--exclude | 大包只取部分目录 |
| 加密包 | --key/--load-custom-bytecode | 标准或自定义加密 |
| 版本锁定 | --force-bytecode-version | 自动检测失败、报错多 |
| 重新打包 | --pck-create+--pck-version | 修改后重新打包分发 |
进阶要点:
--skip-checksum-check跳过 MD5 校验提速;包已损坏想尽量抢救时改用--ignore-checksum-errors- 翻译恢复可用
--translation-hint喂 CSV/MO 提示文件;--patch-translations能把 CSV 翻译直接补丁回 PCK,本地化热更新很顺手 - 超大包按目录分批
--include多次跑,内存峰值明显更低
常见问题
Q1:反编译结果报错一堆?多半是字节码版本没对上。看恢复日志报告的版本,用--force-bytecode-version锁定;仍报很多非导入错误时,用原游戏同版本编辑器打开,或直接拿原游戏二进制作导出模板再恢复。
Q2:--key到底怎么填?64 个十六进制字符(32 字节),形如000102…1E1F,算法要与游戏加密方式一致(AES-256-CFB、Camellia 或 Aria)。密钥错的话解密失败或资源直接变乱码——多数解密问题其实是密钥不对,而不是算法不对。
Q3:什么时候要写自定义解密脚本?先确认"密钥正确、但走的不是标准加密"(可用 Ghidra 之类工具反查二进制)。然后继承CustomDecryptor写 GDScript(需 Godot 4.5+),重写_parse_and_decrypt,写法见 docs/custom_decryptors.md。
Q4:结果和原源码一样吗?不一样。注释、排版、部分命名都会丢,得到的是逻辑等价的骨架代码,需要人工润色。
Q5:能从源码编译吗?可以。先
git clone https://gitcode.com/GitHub_Trending/gd/gdsdecomp把仓库放进 Godot 源码的modules/gdsdecomp目录,再按 Godot 官方文档重编引擎,额外依赖 rustup 与 dotnet 10 SDK。只使用不开发的话,直接下 release 更省事。
扩展与生态
仓库按职责分层,新人读起来有章法:
bytecode/:版本化反编译引擎,新版本的解析器类由 bytecode_generator.py 自动生成exporters/:15+ 类资源导出器(场景、纹理、音频、字体、翻译、C# 程序集等)crypto/:AES/Camellia/Aria 加密上下文与自定义解密器基类compat/:多版本资源格式兼容(二进制、文本、XML 等读写器)godot-mono-decomp/:C# 程序集反编译与 .NET 变换,C# 项目恢复时配--csharp-assemblytests/:多版本 pck 与脚本夹具,回归验证反编译正确性
想参与贡献,路径非常明确:分析某个新 Godot 版本的字节码差异 → 登记进misc/bytecode_versions.json→ 跑生成脚本产出解析器 → 用 tests/ 验证。这个仓库最缺的就是"愿意记录新版本差异表"的人。
回到开头那块死掉的硬盘:只要发布出去的包还在磁盘上,项目就没真正死。clone 下来跑一次--recover,几月前的心血就能从编译产物里捞回骨架。觉得有用的话,给仓库点个 Star,或者提一个新版字节码差异表的 PR,都是最直接的帮助。
【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考