4.9 KiB
title, date, excerpt, tags, rating
title | date | excerpt | tags | rating |
---|---|---|---|---|
Untitled | 2025-07-28 10:06:02 | ⭐ |
前言
- DXBC/DXIL 反汇编:HLSL Decompiler:https://zhuanlan.zhihu.com/p/1927111489627599176
正文
项目背景
从 UE5 和 DirectX12 的时代开始,Shader Model 6.0+ 和它的新编译格式 DXIL,已经接替老旧的 DXBC 成为新时代的标配。这意味着,当我们截帧分析基于 UE5 + DX12 的游戏时,看到的 Shader 代码不再是熟悉的 DXBC,而是 DXIL 了。
对于热衷于深挖渲染管线一探究竟的逆向爱好者来说,这带来了一个痛点:我们急需一个能将 DXIL 反编译回可读性强的 HLSL 源码的工具。
HLSL 反编译的历史
在 DXBC 时代(Shader Model 5.1 及之前),开源项目 3Dmigoto 旗下的 HLSLDecompiler 堪称神器。 它甚至被专门 Fork 出来(zxxyye/HLSLDecompiler),集成到 RenderDoc 中作为插件使用,并收获了 300+ Star 和 100+ Fork,足见其受欢迎程度和逆向需求的旺盛。
现在与将来
然而,时代变了。3Dmigoto 项目本身已经陷入沉寂,其下的 HLSLDecompiler 子模块更是多年未曾更新。
根据作者在 Issue #358 中的说法,这个反编译器对 Shader Model 4.0 为止的 DXBC 代码具有良好的支持性,然而对于 Shader Model 5.0+ 的着色器代码已是捉襟见肘,并且大概率不会再有任何更新。
实际体验也印证了这点。很多 Shader Model 5.0+ DXBC 的基础指令(甚至包括 numthreads
)它都翻译不出来,已经完全无法满足现代游戏分析的需求。
一言以蔽之,老工具已无法胜任 DXIL 和部分 DXBC 的反编译工作。为了解决这个痛点,我们需要打造一个全新的逆向分析工具:HLSL-Decompiler。
它的目标很明确:高效、准确地将 DXBC / DXIL / SPIR-V 反编译回可读的 HLSL 源码,并且能无缝集成到 RenderDoc 中,真正做到「开箱即用」,接续前人未完成的使命。
项目简述
开源库
本项目基于如下开源库。它们权威,高质量,并且正活跃地持续维护。
- DirectXShaderCompiler (DXC):微软官方提供的现代 HLSL 编译器。其中包括关键组件 dxbc2dxil,将老式 DXBC 转换为 LLVM IR 形式的 DXIL。
- dxil-spirv:将 DXIL 或其 LLVM IR 形式高效地转换为 SPIR-V。作者同时也是 SPIRV-Cross 的重要贡献者。
- SPIRV-Cross:KhronosGroup 官方维护的 SPIR-V 反汇编工具,支持从 SPIR-V 到 HLSL 的转换。
工具链
该项目的核心就是巧妙地串联起上述库,形成一个高效的反编译流水线。原理如下图所示。
为什么你需要它?
- 分析 UE5 / DX12 游戏渲染管线:轻松查看截帧得到的 DXIL Shader 源码。
- 逆向老旧 DXBC (SM5.1):老工具搞不定的,它能搞定。
- 研究 Vulkan Shader (SPIR-V):方便地将 SPIR-V 转回 HLSL 进行分析或移植。
- RenderDoc 插件集成:安装即用,分析体验丝滑流畅。
- 开源 & 活跃:基于活跃项目构建,持续维护更新有保障。
项目地址
项目已开源在 GitHub:https://github.com/YYadorigi/HL