公司动态
Godot 逆向工程实战:gdsdecomp 帮你把丢失的源码从游戏包里找回来
Godot 逆向工程实战gdsdecomp 帮你把丢失的源码从游戏包里找回来【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp深夜两点你盯着硬盘上那个空荡荡的源代码目录脑子里只剩下一个念头幸好发布版的game.pck还在。这是不少独立开发者真实经历过的噩梦——代码没推进仓库、硬盘突然损坏、目录被误删唯一幸存的只剩编译打包后的成品文件。如果你正在接触Godot 逆向工程或者恰好在为项目只剩一个 pck 该怎么办发愁那么这篇文章要介绍的开源项目——gdsdecompGDRE Tools很可能就是你要找的答案它能把已发布的 Godot 游戏包重新拆回可读的源码和资源帮你把丢了的项目找回来。它到底是什么一个会逆向做饭的引擎模块你可以把 Godot 导出游戏的过程想象成把面粉、鸡蛋、奶油烤成一个成品蛋糕。引擎把 GDScript 源码编译成.gdc字节码把场景、纹理、音频等资源重新编码后打包进 PCK 文件最后分发的就是一个烤好的成品。正常情况下没人会把蛋糕还原成面粉但当你丢失了原料gdsdecomp 就是那个试图帮你拆蛋糕、找配方的工具。具体来说这个项目提供了四类核心能力完整项目恢复从 APK、PCK 或嵌入 PCK 的 EXE 中加载全部资源反编译所有 GDScript 脚本重建project.godot工程文件把导入过的资源还原成原始导入格式还能重建插件配置。PCK 解包与打包既可以把 PCK/APK/EXE 里的文件逐个提取出来也可以反过来把一个目录重新打成 PCK。GDScript 批量反编译支持 Godot 2.x、3.x、4.x 全系列项目的脚本还原。资源格式互转在文本格式.tres/.tscn与二进制格式之间批量转换。它最初是作为 Godot 引擎的一个模块存在的把项目代码放进引擎的modules目录重新编译即可获得完整的 GUI 与命令行能力官方也发布有独立可执行文件Windows 用户甚至可以用一条scoop命令装好。无论你是只想打开界面点几下还是想把它接进自动化脚本都有对应的入口。为什么能反编译一份跨越十多年的字节码族谱反编译听起来像魔法背后的原理其实很朴素GDScript 编译生成的字节码会随引擎版本不断变化——新增一个关键字、改一个函数名字节码格式就可能不同。要还原 2014 年的脚本你需要知道 2014 年的字节码长什么样。gdsdecomp 的做法是把这份版本演变史完整记录了下来项目在misc/bytecode_versions.json里维护了从最早的 1.0 分支到今天所有字节码修订的定义包括每个修订对应哪些 token、新增或删除了哪些函数bytecode/目录下每个字节码修订都对应一个专属的解析器类如GDScriptDecomp_ebc36a7它们统一继承自同一个基类BYTECODE_HISTORY.md以表格形式整理了每次变化的时间、提交和原因。下表是这份族谱的极简缩影数据来自项目内的版本历史文档时代代表性字节码修订与变化1.0 分支2014 年从0b806ee起步e82dc40加入SETGET关键字字节码版本号升至 32.x 分支23441ec加入var2bytes/bytes2vared80f45加入ENUM版本稳定在 103.x 分支f8a7c46加入MATCHc24c739加入WILDCARD字节码版本来到 12 附近4.x 分支最新定义ebc36a7对应 4.5.0-stable字节码版本号已达 101反编译时工具先通过文件头魔数、脚本结构特征判断项目属于哪个时代再沿着父版本链条逐级尝试找到最合适的解析器。即便遇到小众或修改过的引擎版本你也能用--load-custom-bytecodeJSON_FILE加载自定义定义或者用--dump-bytecode-versionsDIR把全部定义导出为 JSON 自行研究。想确认当前支持哪些版本运行--list-bytecode-versions即可。动手实操五分钟把 game.pck 恢复成可打开的工程理论说完了我们来走一遍完整的恢复流程。请准备一个 PCK、APK 或 EXE 格式的 Godot 游戏文件跟着下面的步骤来。第一步准备好目标文件把游戏文件放到顺手的位置。如果你用的是图形界面版本直接把它拖进程序窗口即可命令行的基础用法是gdre_tools --headless 主命令 [选项]第二步先看看包里有什么正式动手前先确认文件能被正确识别gdre_tools --headless --list-filesgame.pck这条命令会列出 PCK 内所有文件的路径并立即退出。看到脚本、场景、纹理等条目正常列出说明文件解析没有问题可以放心往下走。第三步执行完整恢复gdre_tools --headless --recovergame.pck --outputrecovered_project--recover接受 PCK、APK、EXE 或者已经解包的项目目录--output指定输出目录缺省时会自动生成一个以原文件名加_extracted结尾的目录。恢复过程中工具会提取所有资源、反编译全部.gdc脚本、重建工程文件并把二进制资源转回文本格式。如果游戏使用了标准 Godot 加密记得带上密钥参数gdre_tools --headless --recovergame.pck \ --key000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F密钥是 64 字符的十六进制字符串。在 GUI 版本里你可以在 Set Encryption Key 菜单里完成同样的设置。第四步读一读恢复日志恢复结束后输出目录里会生成gdre_export.log一类的报告文件它是你判断恢复质量的第一手资料。报告会告诉你反编译成功了多少个脚本、导入了多少资源、有没有文件转换失败以及——这一点很关键——建议用哪个版本的 Godot 打开这个工程。建议记下这个版本号并用同版本的 Godot 编辑器打开恢复出的工程兼容性通常最好。报告底部列出的未转换文件及原因也值得留意它会诚实告诉你哪些资源超出了当前能力范围。第五步只恢复你需要的部分完整恢复有时并不必要。比如你只想要脚本可以加上--scripts-only只想处理特定目录用--include和--exclude配合通配符过滤# 只恢复脚本 gdre_tools --headless --recovergame.pck --scripts-only # 排除掉体积大的纹理和音频 gdre_tools --headless --recovergame.pck \ --excluderes://assets/textures/*.png \ --excluderes://assets/audio/*.ogg注意这些通配符匹配的是 PCK 里真实存在的文件res://*.gdc会匹配根目录下的全部.gdc而*.gdc这种不带目录的写法会被当作递归模式等价于res://**/*.gdc。恢复不是全部命令行里还藏着这些能力如果只把 gdsdecomp 当成一键恢复工具你就错过了它的一半价值。它的命令行里还提供了一批可以组合使用的能力这里挑几个常见的整理成表想做的事使用的命令需要配合的参数单独反编译某个.gdc脚本--decompile文件可多次使用也支持通配符把 GDScript 编译回字节码--compile文件--bytecode提交号或版本号从目录创建新的 PCK--pck-create目录--pck-version与--pck-engine-version给已有 PCK 打补丁--pck-patch游戏文件--patch-file源文件目标路径二进制场景/资源转文本--bin-to-txt文件可多次使用文本场景/资源转二进制--txt-to-bin文件可多次使用用 CSV 批量补丁翻译文件--patch-translationsCSV源路径可结合--pck-patch使用举个例子想把一个.tscn二进制场景转回人类可读的文本格式方便用编辑器查看差异只需要gdre_tools --headless --bin-to-txtstage.tscn再比如如果你希望给玩家分发一个修改过的脚本又不想完整解包整个游戏可以用--pck-patch把新脚本直接写进现有 PCK。它支持把产物重新嵌入 EXE--embed参数对分发场景相当实用。三个常见误区以及对应的正确做法基于这个工具的实际使用反馈有三类问题被问得最多我把它们和正确的处理方式放在一起对照说明。误区一遇到解密失败第一反应是写自定义解密器实际大多数情况是密钥不对而不是加密方案特殊。官方文档docs/custom_decryptors.md里明确提醒标准 Godot 项目使用的是 AES-256-CFB 加密只要拿到正确的 64 字符密钥就能解开。只有当确认密钥无误、且用 Ghidra 之类的工具验证过游戏确实没有采用标准加密方案时才值得编写自定义解密器。如果你真的需要脚本必须继承CustomDecryptor类并实现_parse_and_decrypt()方法项目里附带的docs/gdre_standard_encryption.gd是一个很好的参考模板。误区二用任意版本的 Godot 打开恢复结果恢复出的工程对引擎版本很敏感。恢复日志会明确给出检测到的引擎版本建议安装同版本 Godot 再打开。版本跨度太大时脚本语法或 API 差异可能导致工程无法直接运行。误区三指望所有资源都能原样还原目前仍有两类资源转换尚未实现2.x 时代的模型文件dae、fbx、glb 等以及 GDNative / GDExtension 脚本。遇到它们日志里会如实标记为尚未支持不要为此反复重试。另外反编译出的脚本保留的是逻辑结构变量名可能经过编译期优化复杂脚本往往需要人工整理这是所有反编译工具的共性不必苛求完美。写在最后把故事补完回到开头那个深夜的场景硬盘坏了、源码没了、只剩一个game.pck。有了 gdsdecomp这个故事不必以重写整个游戏结尾——你可以先恢复出全部脚本和资源评估损失再决定是直接修复重建还是把它当作重构的起点。它未必能还原每一行注释但它能让你在最短时间内拿回项目的骨架。如果你想现在就试试可以这样开始Windows 用户scoop bucket add games后执行scoop install gdsdecomp即可从命令行使用gdre_tools想用图形界面从官方 release 页面下载对应平台的可执行文件把 pck 拖进窗口即可想从源码编译执行git clone https://gitcode.com/GitHub_Trending/gd/gdsdecomp把仓库放进 Godot 引擎的modules目录命名为gdsdecomp然后按引擎编译文档重建。编译需要 rustup 与 dotnet 10 SDK模块在配置阶段会自动把 CLI 钩子补丁应用到引擎的main/main.cpp重复运行scons不会产生副作用。最后留一个小小的建议动手恢复之前先给原始 PCK 做一份备份用--list-files确认文件无误后再让工具放手干活。祝你的下一次逆向工程之旅顺利——也愿你永远不需要用到它。【免费下载链接】gdsdecompGodot reverse engineering tools项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考