如何保护你的Godot游戏
Melaton
编辑于 2026年02月14日 15:26
言语肇始兽人视觉小说极限创作挑战赛

由于godot的开源,逆向变得易如反掌,本文会提供一些保护的方案

阅读本文你需要一定的 Godot 开发基础

永远记住:没有绝对安全的保护,唯一能做的只有增加逆向的时间成本

使用PCK 密钥加密

这种是官方的加密方法,逆向相对简单,以下是操作方法

1. 配置环境

  • 安装 Git 和 Python

  • 安装 Scons `pip install scons`

  • 安装 llvm-mingw https://github.com/mstorsjo/llvm-mingw/releases,下载 msvcrt-x86_64.zip,添加 bin 到环境变量

2. 生成密钥

1. 下载 openssl https://www.openssl.org/source

2. 使用 `openssl rand -hex 32` 生成密钥 如`f91476533bd554c408e3d03ec634da97ee5e6ccae009dc8062dd39cbd23fa3fc`

3. 保存好这个密钥

3. 获取Godot源码

1. `git clone https://github.com/godotengine/godot.git`

2. 选择对应的版本如 `git checkout tags/4.6-stable`

4. 构建导出模板

1. 在源码根目录打开终端,输入`set SCRIPT_AES256_ENCRYPTION_KEY=你的key`

2. 如果不需要 C# 功能:

代码块
PlainText
自动换行
复制代码
scons platform=windows target=template_release
复制成功

如果需要 C#:

代码块
PlainText
自动换行
复制代码
scons platform=windows target=template_release module_mono_enabled=yes
复制成功

在命令后添加 -j 即可多线程编译,如 -j32 就是32线程

3. 等待构建结束,结束后在 /bin 会有以下两个文件

godot.windows.template_release.x86_64.console.exe

godot.windows.template_release.x86_64.exe

如果需要debug模式,则需要另外构建`target=template_debug`

5. 使用构建模板

在Godot中,项目 - 导出 - 添加 - Windows Desktop

选项 - 自定义模板 - 发布 定位到你的 `godot.windows.template_release.x86_64.exe`

加密 - 加密导出的PCK - 加密密钥 填写前面生成的密钥

代码混淆

建议使用现成的插件 gdmaim https://github.com/cherriesandmochi/gdmaim

使用 C#

因为目前大部分工具没办法还原完整的 C# 代码,所以核心代码使用 C# 是相对安全的选项

导出 C# 后可以使用现有的 C# 混淆工具

进阶防护

自定义PCK加解密方法

在 `core/io/file_access_encrypted.cpp` 中,`open_and_parse` 负责pck的解密

代码块
C++
自动换行
复制代码
FileAccessEncrypted::open_andparse(Ref<FileAccess> p_base, const Vector<uint8_t> &p_key, Mode p_mode, bool p_with_magic)
复制成功

其中 `p_key` 是32字节的密钥

你可以在这里对 `p_key` 进行处理,比如变换其中的字节、二次加密之类的,这样即使 gdke 能读取到密钥,也无法用 gdsdecomp 解包,因为游戏在使用密钥解密时有额外的处理

如果想要更强的保护,我建议在编译 Godot 导出模板时就进行混淆,这样逆向时就没办法轻易定位到 `open_andparse` 这个函数,建议在每个版本发布时都重新进行一次 Godot Engine 混淆,可以保证跨版本时更难进行修改

Strip 导出模板

源码里的`gdscript::load_byte_code`函数负责读取加密后的文件并解密,逆向者可以轻易定位到该函数并找到对应的解密key `script_encryption_key`。使用`strip`命令可以消去symbols,增加定位函数的逆向成本

删除错误日志输出

即使函数名被strip,字符串还是能被轻易定位,godot的错误日志函数`_err_print_error`可以泄露当前函数的具体名称,因此可以在构建阶段删除所有错误日志。或者采用更温和的方法,将字符串使用保护器动态加解密,这样既可以保留错误日志也能增加逆向成本

Credits

https://github.com/bruvzg/gdsdecomp

https://docs.godotengine.org/en/4.2/contributing/development/compiling/compiling_with_script_encryption_key.html

https://godot.community/topic/35/protecting-your-godot-project-from-decompilation

http://web.archive.org/web/20240619110319/https://godot.community/topic/35/protecting-your-godot-project-from-decompilation