RenoDX着色器逆向入门:decomp.exe与3Dmigoto如何反编译SM6.0+游戏着色器
【免费下载链接】renodxRenovation Engine for DirectX Games项目地址: https://gitcode.com/GitHub_Trending/re/renodx
RenoDX(Renovation Engine for DirectX Games,DirectX 游戏翻新引擎)是一套游戏模组工具集:替换着色器、注入缓冲、升级交换链、添加叠加层。它的逆向工作流核心就是两个反编译器——decomp.exe负责 Shader Model 6.0+ 的 HLSL 还原,3Dmigoto的cmd_Decompiler.exe负责 SM5.0 及以下。本文带你用最小成本跑通"从游戏里拿到着色器 → 反编译成可读 HLSL → 替换回游戏"的完整流程。
一、为什么着色器逆向需要"双反编译器"
现代游戏运行时使用的着色器是二进制字节码(.cso/ DXIL),不是源码。不同 Shader Model 需要不同的工具链:
| Shader Model | 工具 | 说明 |
|---|---|---|
SM 6.0+(ps_6_0~ps_6_6) | decomp.exe | RenoDX 自带,基于 DirectXShaderCompiler(D3DCompiler)实现 |
| SM 5.0 及以下 | 3Dmigotocmd_Decompiler.exe | 第三方经典工具,仓库最低要求版本1.3.16(见 cmake/tool-versions.cmake) |
💡 分界线就是 DXIL:SM6 开始微软改用新的 DXIL 字节码格式,旧工具看不懂,所以 RenoDX 专门写了一个基于 D3DCompiler 的反编译器。
RenoDX 之所以能做到"通吃",是因为它建立在 Reshade 的 add-on 体系上(见 README.md),无需针对特定游戏 exe 打补丁,兼容性极宽。
二、decomp.exe:SM6.0+ 着色器反编译
decomp.exe是命令行单文件工具,入口在 src/decompiler/cli.cpp,核心反编译逻辑(指令映射、签名解析、lerp/pow 模式识别等)在 src/utils/shader_decompiler_dxc.hpp。
它的工作分两步:
- 反汇编:调用 D3DCompiler 把二进制着色器还原成中间指令文本;
- 反编译:解析指令流、输入/输出签名、cbuffer 与资源绑定表,重建接近可读的 HLSL。
快速上手:3 条命令搞定
# 1. 把 .cso 反编译成同目录 .hlsl(不指定输出时自动用输入名) decomp.exe shader.cso # 2. 指定输出路径,--flatten 把复杂控制流展开为平坦代码(更易读) decomp.exe shader.cso output.hlsl --flatten # 3. 批量处理时用 --skip-existing 跳过已反编译的文件 decomp.exe *.cso --skip-existing完整的参数帮助可以直接运行decomp.exe查看,用法提示见 cli.cpp 第 23~24 行。
--flatten值得单独说:DXIL 里常有编译器生成的复杂分支结构,展开后代码更"原始"但更好改,逆向圈常用它来确认循环和条件的真实逻辑。
三、3Dmigoto:老一代着色器的兜底方案
SM5.0 及以下的着色器(如大量 DX11 老游戏的ps_5_0、cs_5_0)用 3Dmigoto 的cmd_Decompiler.exe处理即可。仓库的官方贡献指南 docs/CONTRIBUTING.md 明确列出了它作为环境依赖之一:
- 从 3Dmigoto 的 release 页下载工具包;
- 把
cmd_Decompiler.exe放入.\bin; - 或直接跑 scripts/setup-dev-env.ps1 的
-Tools 3dmigoto -Install,脚本会自动拉取配置好的版本。
工具链版本基准全部集中在 cmake/tool-versions.cmake(DXC、Slang、glslang、3Dmigoto 各一条),改版本只动这一个文件。
四、着色器文件命名规范:一眼看懂逆向产物
RenoDX 对反编译产物的命名有严格约定,构建系统会自动扫描src/games/下的所有.hlsl(见 docs/CONTRIBUTING.md 的"Automated configuration"一节):
{名称}_0x{CRC32}.{ps|cs|vs}_{大版本}_{小版本}.hlsl例如 tonemap_0x756E88B2.ps_4_0.hlsl:tonemap是人为起的名字,0x756E88B2是该着色器在游戏中的 CRC32 哈希(用于运行时精确匹配),ps_4_0是像素着色器 SM4.0。你从 decomp.exe 拿到的文件按此规则改名放进游戏模组目录,就能被构建系统识别并编译替换。
仓库里几百个游戏模组都是这么组织出来的,随便挑一个看结构即可,比如 src/games/valheim/ 或 src/games/fallout76/。新建模组可以从模板目录 src/games/generic 复制起步。
五、进阶:devkit 实时转储,不进游戏编辑器
想确认"游戏当前到底在跑哪个着色器"?RenoDX 提供devkit游戏内检查插件 +mcp_bridge桥接进程(构建目标见 docs/DEVKIT_MCP.md):
devkit_list_shaders/devkit_get_shader:列出并查看帧内着色器;devkit_dump_shader:把指定着色器转储为二进制,交给上面的 decomp.exe 反编译;- 转储目录约定为
renodx-dev/dump,热替换用renodx-dev/live。
官方建议的排查思路是从一帧的末尾往回找(最终 blit、UI 合成、场景合成),先定位"HDR 数据在哪一步丢失",再反编译对应的 pass——这套流程在 DEVKIT_MCP.md 第 91~108 行 有完整描述。
六、常见问题与技巧
Q1:反编译出来的代码为什么全是exp2(log2(x)*y)这种怪写法?这是编译器优化痕迹。decomp.exe 已内置了常见模式还原(如((b-a)*t)+a→lerp(a,b,t)),映射表可参考 notes.md,实现见 shader_decompiler_dxc.hpp 的 OptimizeString。
Q2:反编译失败或输出为空?先确认 DXC 工具链版本达标(CMake 配置时会自动检查并警告),用 scripts/setup-dev-env.ps1-Update更新即可;再确认 Reshade 已正确安装(RenoDX 基于其 add-on 系统,是硬性依赖)。
Q3:SM6 和 SM5 的转储文件有什么区别?转储扩展名按 API 走:DirectX 系统一是.cso(Vulkan 是.spv),逻辑见 src/utils/shader_dump.hpp。拿到文件后按版本号选工具即可:_6_x找 decomp.exe,_5_x及更低找 3Dmigoto。
Q4:改完之后如何验证?把 HLSL 按命名规范放进游戏目录重新构建模组,devkit 的devkit_load_live_shaders支持热加载,改一行 shader 不用重启游戏——这是 RenoDX 相比传统 mod 开发最大的效率优势。
七、小结
- SM6.0+→
decomp.exe,一行命令出 HLSL,--flatten辅助阅读; - SM5.0-→ 3Dmigoto
cmd_Decompiler.exe,setup-dev-env.ps1可一键装好; - 产物按
{名称}_0x{CRC}.{type}_{x}_{y}.hlsl命名即可被构建系统自动接管; - 拿不准目标 pass 时,用 devkit + mcp_bridge 从帧尾倒查,再转储反编译。
照着这条链路走,从"游戏里的一坨二进制"到"可修改的着色器源码",通常只需要半小时。
【免费下载链接】renodxRenovation Engine for DirectX Games项目地址: https://gitcode.com/GitHub_Trending/re/renodx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考