由于godot的开源,逆向变得易如反掌,本文会提供一些保护的方案
阅读本文你需要一定的 Godot 开发基础
永远记住:没有绝对安全的保护,唯一能做的只有增加逆向的时间成本
这种是官方的加密方法,逆向相对简单,以下是操作方法
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# 功能:
scons platform=windows target=template_release 如果需要 C#:
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# 混淆工具
在 `core/io/file_access_encrypted.cpp` 中,`open_and_parse` 负责pck的解密
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 混淆,可以保证跨版本时更难进行修改
源码里的`gdscript::load_byte_code`函数负责读取加密后的文件并解密,逆向者可以轻易定位到该函数并找到对应的解密key `script_encryption_key`。使用`strip`命令可以消去symbols,增加定位函数的逆向成本
即使函数名被strip,字符串还是能被轻易定位,godot的错误日志函数`_err_print_error`可以泄露当前函数的具体名称,因此可以在构建阶段删除所有错误日志。或者采用更温和的方法,将字符串使用保护器动态加解密,这样既可以保留错误日志也能增加逆向成本
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