☰
从 .gdc 到源码:GDSDecomp 逆向恢复 Godot 项目的完整教程
2026/10/18 1:27:35 网站建设 项目流程

从 .gdc 到源码:GDSDecomp 逆向恢复 Godot 项目的完整教程

【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp

Godot 打包发布后,GDScript 脚本会被编译成机器可读的.gdc字节码文件,你再也看不到源码长什么样。GDSDecomp(Godot RE Tools)就是专门处理这件事的工具集:把.gdc反编译回.gd文本、把 PCK 资源包里的文件批量提出来、把被自动转换的二进制资源还原成原始导入格式,最终重建出一个可以在编辑器里继续开发的工程。

先搞清楚 GDSDecomp 能做什么

它本质上是 Godot 引擎里的一个模块,编译进引擎后,既可以作为 GUI 独立应用使用,也可以在命令行里跑(--headless模式),核心能力就三块:

  • 整包恢复(recover):输入一个.pck、Android.apk、或者内嵌了 PCK 的.exe,直接输出一套可用的工程目录——脚本全部反编译、导入资源还原、project.godot和插件配置一并重建。
  • 纯提取(extract):只把包里的文件原样拿出来,不做任何转换。适合"我就想看看里面有什么"的场景。
  • 格式互转:.tscn/.tres文本与二进制互相转换、GDScript 编译与反编译、PCK 的创建与修补。

版本支持上,反编译覆盖 Godot4.x、3.x、2.x三代项目;工具内置了 59 个历史字节码版本的定义(misc/bytecode_versions.json),从 2014 年的 Godot 1.0-dev1 一直排到 2025 年的 4.5,绝大多数老项目都能对上号。

有两类东西它还原不了:2.x 时代的 3D 模型(.dae、.fbx、.glb等),以及 GDNative / GDExtension 写的原生脚本。如果你的项目重度依赖这两样,恢复后的工程需要手动补资源。

GDSDecomp 怎么安装

三条路,按省事程度排序:

1. 下载预编译版本(推荐)

去项目的 Release 页面下载对应平台的压缩包,解压即用。普通用户走这条就够了。

2. Windows 下用 Scoop

scoop bucket add games scoop install gdsdecomp

3. 从源码编译

需要把仓库放到 Godot 源码树的modules/目录下并作为 Godot 模块重新构建引擎:

git clone https://gitcode.com/GitHub_Trending/gd/gdsdecomp godot/modules/gdsdecomp

额外依赖 Rust(rustup)和 .NET 10 SDK(用于 C# 工程反编译部分)。编译流程本身遵循 Godot 官方的引擎构建文档。编译出的编辑器可以直接跑独立 GUI:bin/godot.linuxbsd.template_debug.x86_64 --headless --path=modules/gdsdecomp/standalone --recover=<你的包>。

下面两种用法,GUI 和命令行做的是同一批事,选你顺手的即可。

GUI 里怎么恢复一个 Godot 项目

第一次用建议走图形界面,能看到每一步的结果。

  1. 启动应用后,在菜单里选Recover project...,或者直接把.pck/.exe/.apk拖进窗口。
  2. 打开包后进入 PCK Explorer 文件树,可以勾选/取消勾选要处理的文件。
  3. 在底部 Options 里二选一:
    • Extract only:仅提取文件;
    • Full Recovery:完整恢复(反编译 + 资源还原 + 重建工程文件)。
  4. 指定 Destination folder,点 Extract 开始。

跑完后会弹出一份恢复报告,包含三个关键信息:检测到的引擎版本(用它对应版本的编辑器打开恢复的工程)、成功/失败的反编译脚本数量、成功还原的资源数量。

命令行:批量提取一个 PCK 包

GUI 适合交互式操作,命令行适合批处理和脚本化。所有操作都是gdre_tools --headless <主命令> [选项]的形式。

先列后取——不确定包里有啥时,先用--list-files看一眼清单:

gdre_tools --headless --list-files=game.pck

只提取脚本(跳过所有资源,速度最快):

gdre_tools --headless --recover=game.pck --scripts-only --output=out_scripts

整包提取:

gdre_tools --headless --extract=game.pck --output=out_full

--recover和--extract都支持--include/--exclude两个 glob 参数,用来圈定处理范围,比如--include="res://**/*.gdc"只动脚本。glob 的写法有个容易踩的点:模式会相对res://根目录解析,不带res://前缀时自动补上;单独一个*.gdc会被当作递归模式,等价于res://**/*.gdc。

加密包怎么办:Godot 标准加密用--key=<64位十六进制字符串>传入密钥即可,例如:

gdre_tools --headless --extract=game.pck --key=0001020304050607... --output=out

如果游戏用的是魔改加密(不走 Godot 标准 AES-256-CFB 方案),就需要写一个继承CustomDecryptor类的 GDScript 解密脚本,仓库里的 docs/custom_decryptors.md 有完整指南,docs/gdre_standard_encryption.gd 是标准加密的参考实现。

只反编译 .gdc,不要整个包

很多时候你不需要恢复全工程,只是想把几个.gdc看回文字。这时用--decompile,支持 glob 批量:

gdre_tools --headless --decompile=**/*.gdc

反编译结果默认覆盖在原文件旁边(main.gdc→main.gd)。两个高频选项:

  • --bytecode=<版本或提交哈希>:手动指定字节码版本,比如--bytecode=4.3.0。工具默认自动检测,但检测失败或结果不对时用它强制指定;
  • --force-bytecode-version=:恢复整包时使用的对应版本强制选项。

反向操作也存在:--compile=<GD_FILE> --bytecode=4.3.0可以把.gd按指定版本编译回字节码,改完脚本想重新塞回包里时就用得上。

改完之后:重新打包与修补 PCK

提取 → 修改 → 回注,是逆向流程的闭环。

从零造一个 PCK(比如你手里就是一个散文件目录):

gdre_tools --headless --pck-create=my_dir \ --pck-version=2 --pck-engine-version=4.3.0 \ --output=new_game.pck

--pck-version取值 0/1/2 对应 PCK 的格式版本,--pck-engine-version要写明目标引擎版本。加上--key=可以顺手加密,--embed=<exe>可以把 PCK 内嵌进可执行文件。

往现有 PCK 里打补丁(只替换个别文件,其余原样保留):

gdre_tools --headless --pck-patch=game.pck \ --patch-file=./my_script.gd=res://scripts/my_script.gd \ --output=patched.pck

--patch-file左边是你本机的源文件,右边是包内目标路径,可重复多次。这个命令还能和翻译修补--patch-translations=<csv文件>=<包内路径>组合使用,批量更新游戏的翻译文本。

另外两个纯格式转换命令值得知道:--txt-to-bin=<FILE>把文本场景/资源转回二进制(重新打包时引擎要求的格式),--bin-to-txt=<FILE>反过来,方便肉眼检查二进制资源内容。

遇到问题的排查清单

按出现频率排个序:

  1. 加密解不开。九成情况是密钥不对,而不是加密方案不标准。先用确认过的密钥试标准方案;确认密钥没错还解不开,才去考虑游戏魔改了加密,走 CustomDecryptor 路线(可用--custom-decryption-script加载)。
  2. 反编译结果错乱或报错。字节码版本没对上。用--list-bytecode-versions查内置支持的全部版本,再用--force-bytecode-version逐个尝试。极端情况(游戏用了魔改引擎)可以--dump-bytecode-versions=<DIR>把 59 个内置字节码定义导出成 JSON,对照着自定义一份,再经--load-custom-bytecode加载。
  3. MD5 校验失败。提取时文件被改动过或包本身有损坏。加--ignore-checksum-errors跳过校验继续,或--skip-checksum-check干脆不做校验。
  4. 恢复后的工程在编辑器里报错多。恢复报告里写明的 Godot 版本要用对应版本的编辑器打开;项目如果用了定制版引擎,报告也会提示——此时拿原游戏的二进制作为导出模板再导一次通常能解决。
  5. 大项目跑不动。用--include分批处理,配合--scripts-only先拿脚本,别一次性全量恢复。

合规提醒:逆向工具只在法律允许的场景下用——恢复自己丢失的源码、分析自己有权修改的项目。对别人正在销售的游戏做修改和再分发,多数地区有明确法律风险。动手前先备份原始文件。

仓库内部结构速览

如果你想改工具本身,这几个目录是关键:

目录职责
bytecode/各版本 GDScript 字节码定义(每版本一对 .cpp/.h),由bytecode_generator.py从misc/bytecode_versions.json生成
exporters/各类资源的导出/还原实现:纹理、音频、场景、字体、C# 工程等
compat/旧版资源格式兼容层(3.x/2.x 的文本-二进制差异处理)
crypto/标准加密与自定义解密器框架
godot-mono-decomp/C# 工程的反编译器(.NET 部分,编译时需要 .NET SDK)
standalone/独立 GUI 应用资源,编译后用它跑命令行入口

命令参数的完整清单以--gdre-help输出为准;各功能模块的详细文档在 doc_classes/ 下,按类名组织。


总结一下最常用的三条路径:只想看脚本→--recover + --scripts-only;要改资源再塞回去→--extract+ 修改 +--pck-patch;丢了源码要整工程→ GUI 里 Full Recovery 一把梭。版本对、密钥对,剩下的交给它就行。

【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询