gdsdecomp 实战指南:一条命令,把 Godot 游戏 PCK 反编译回可编辑项目
【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp
你手上只有一个游戏的 APK,或者几个孤零零的 .gdc 文件,Godot 编辑器里打开全是二进制——这正是 gdsdecomp 的用武之地:它能反编译 .gdc 字节码回 .gd 源码,从 PCK、APK 或内嵌 EXE 中恢复完整工程,还能处理加密文件。读完这篇文章,你能把一个"死掉"的打包文件变成可以直接编辑的 Godot 项目。
为什么需要它
一个 Godot 项目导出后,等于"只剩外壳":脚本全是 .gdc 字节码,纹理、场景变成了 .ctex、.res 这类二进制格式。丢了源码之后,传统做法每一步都很磨人:想反编译一个 .gdc,得先手动查清它用的是哪个 Godot 版本的字节码定义;项目如果还加密了,你得自己写 AES-256-CFB 解密逻辑,再逐个核对文件头里的 MD5;更麻烦的是 2.x、3.x、4.x 的字节码格式各不相同,一套工具往往只管得住一个版本。
用上 gdsdecomp 之后,这些步骤被压缩成一条命令:--recover从 PCK、APK 或内嵌 EXE 读入资源,自动匹配字节码版本,解密、反编译全部脚本,再把导入资源转回源格式、重建项目文件,最后给你一个能直接在编辑器里打开的工程目录。
快速上手:装好工具,跑通第一条恢复命令
第一步:装好可执行文件目标:命令行里能直接调用 gdre_tools。 操作:Windows 下用 Scoop 两行装好:
scoop bucket add games scoop install gdsdecomp其他平台从项目 releases 页面下载对应平台的发布版。 确认成功:运行gdre_tools --headless --version,能打印出工具版本号即可。
第二步:跑第一条恢复命令目标:把一个真实的 PCK 恢复成工程。 操作:
gdre_tools --headless --recover=game.pck--recover后面跟 PCK、APK、EXE 或已解压的项目目录均可;项目加密时追加--key=<64位十六进制密钥>。 确认成功:当前目录生成一个<NAME>_extracted形式的输出目录(可用--output=<DIR>指定),里面出现 .gd 文件。
第三步:看恢复报告验证结果目标:确认脚本全部反编译成功。 操作:看命令结尾输出的恢复报告,或打开输出目录里的 gdre_export.log。 确认成功:报告里 "Decompiled scripts: N" 且 "Failed scripts: 0" 即成功;报告还会写明该用哪个版本的 Godot 编辑器打开这个项目。
底层逻辑:一次恢复是怎么跑完的
你可以把整个过程想成给一件"上了漆、打了箱"的古董家具做修复:开箱、鉴定、脱漆、补面、组装——每一步都对应一个明确的技术动作。
- 开箱(解包):读取 PCK 的文件索引(APK/EXE 则先定位内嵌的 PCK 数据区),按原始路径把每个文件落盘 → 产出一份完整的原始文件集合,含 .gdc 字节码和 .ctex 等二进制资源。
- 鉴定(版本识别):从文件头判断项目由哪个 Godot 版本编译,在内置字节码版本表(参见 BYTECODE_HISTORY.md)中匹配对应定义;识别不出的自定义版本,用
--force-bytecode-version或--load-custom-bytecode显式指定 → 产出一套能"读懂"这批字节码的定义。 - 脱漆(解密):加密项目用
--key提供的 64 位十六进制密钥跑 AES-256-CFB 解密,再用文件头里的 MD5 校验完整性 → 产出明文资源数据。 - 补面(反编译):按字节码定义逐条还原指令,重建函数、变量与字符串 → 产出可读的 .gd 源码。
- 组装(工程重建):把 .ctex 等导入资源转回源格式,重建导入元数据与项目配置文件 → 产出能直接拖进 Godot 编辑器打开的工程目录。
三个高频任务
任务一:从 APK 或 PCK 完整恢复一个项目
你想做什么:手上有游戏 APK,要拿回整个工程。 怎么做:
gdre_tools --headless --recover=game.apk加密项目追加--key=<密钥>;只想要脚本可以加--scripts-only省时间。 如何判断成功:恢复报告里 "Failed scripts: 0",输出目录结构完整(有项目文件和成批 .gd 文件),用报告指定的 Godot 版本打开无大面积报错。
任务二:反编译单个加密的 .gdc 文件
你想做什么:只有一两个 .gdc,不想动整个工程。 怎么做:
gdre_tools --headless --decompile=main.gdc --bytecode=4.3.0--bytecode接引擎版本号或提交哈希(如f3f05dc),必须和文件实际的编译版本一致;加密文件同样追加--key。 如何判断成功:.gdc 旁边生成同名 .gd(默认输出在源文件同目录,可用--output指定),打开后函数结构、常量值都正常。
任务三:先列文件,再按需提取 PCK 内容
你想做什么:不确定 PCK 里有什么,或者只要其中一部分资源。 怎么做:
gdre_tools --headless --list-files=game.pck gdre_tools --headless --extract=game.pck --include="res://**/*.gdc"--include支持递归通配符**,模式以res://为根;不写前缀时默认挂到res://下。 如何判断成功:第一条命令打印出完整文件清单后直接退出;第二条命令只在输出目录里生成匹配的文件。
⚠️ 不工作的时候
加密文件解不开
- 现象:恢复或提取时报 MD5 校验错误、解密失败,文件内容全是乱码。
- 原因:
--key必须正好是 64 位十六进制字符串;密钥在游戏里可能被二次变换,你拿到的值不等于实际使用的值;也可能是非标准加密方案。 - 怎么办:先确认游戏是否使用 Godot 标准加密且密钥无误;确认是自定义加密后,按 自定义解密脚本文档 写解密脚本,通过
--custom-decryption-script参数传入。
字节码版本不识别或反编译出乱码
- 现象:
--decompile报版本不支持,或能出文件但函数结构错乱。 - 原因:Godot 不同版本字节码格式不同,未指定
--bytecode,或指定了和文件不匹配的版本。 - 怎么办:先运行
gdre_tools --headless --list-bytecode-versions查可用版本,再用--bytecode=<版本或提交哈希>显式指定;引擎是魔改版时,改用--force-bytecode-version或--load-custom-bytecode加载自定义 JSON 定义。
恢复后工程在编辑器里大面积报错
- 现象:恢复"成功"了,但用 Godot 打开后脚本和资源大量报错。
- 原因:编辑器版本和原游戏编译版本不一致;或该资源属于当前未支持的转换(如 2.x 模型、GDNative/GDExtension 脚本,见 README 的 Limitations)。
- 怎么办:打开输出目录下的 gdre_export.log(恢复报告顶部会写明路径),找到 "Use Godot editor version X to edit the project" 一行,换到对应版本的 Godot 再打开;报告里标为 Not converted / Lossy 的资源,就是当前版本尚未实现转换的格式。
小结
回到开头那个场景:手里的 APK 和孤立的 .gdc 不再是死文件——--recover还你一个可编辑的工程,--decompile还你一段可读的源码。gdsdecomp 的字节码版本表还在随引擎版本持续扩充,遇到识别不了的新版本,带上 gdre_export.log 去提个 issue 就行;或者现在就挑一个你手边的 PCK,跑一遍第一条命令试试。
【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考