DavideFranchioni/webcil-converter
GitHub: DavideFranchioni/webcil-converter
一个轻量级工具,用于将 .NET WebCIL 文件转换为标准 PE .dll,以便 IL 反编译器能读取。
Stars: 0 | Forks: 0
# webcil-converter
一个微小、无依赖的工具,可将 .NET **WebCIL** 文件(`.webcil` 或
包含 WebCIL 有效载荷的 `.wasm` 文件)转换为标准 **PE**(`.dll`)文件,
使得任何 IL 反编译器都能读取——例如 ILSpy、dnSpy、dotPeek、JetBrains Rider 等。
单一源文件,约 200 行 C# 代码,无 NuGet 依赖项。
## 为何存在
从 **.NET 9 / Blazor 9** 开始,框架以 Microsoft 内部一种名为 **WebCIL** 的紧凑容器形式
提供浏览器端程序集。
反编译器期望一个真正的 PE 头,因此一旦你将它们指向 `.webcil`(或包含 WebCIL 有效载荷的 `.wasm`)文件,它们就会出错。
官方的 Microsoft 工具可以进行转换,但这需要引入 `Microsoft.NET.WebAssembly.Webcil` 及其传递性依赖项——在资源受限的环境(例如安全审计虚拟机、应急响应机器或需要保持精简的 CI 运行器)中,这完全不可行。
此工具内联复制了格式处理逻辑。只需将 `Program.cs` 放入安装了 .NET 8+ SDK 的任何目录,你就拥有了一个可工作的转换器。
## 用法
```
# 构建
dotnet build -c Release
# 在多个文件上运行
dotnet run --no-build -c Release -- path/to/Assembly.webcil
dotnet run --no-build -c Release -- path/to/Assembly.wasm
dotnet run --no-build -c Release -- *.wasm
```
输出的 `.dll` 文件将写在每个输入文件旁边。如果所有转换都成功,退出码为 `0`,否则为 `1`。
```
$ dotnet run --no-build -c Release -- BlazorMonaco.wasm
BlazorMonaco.wasm -> BlazorMonaco.dll (262,656 bytes, 3 sections, CLR rva=00002008/sz=00000048)
```
然后在任何 IL 反编译器中打开生成的 `.dll` 文件。
## 工作原理
一个 `.webcil` 文件(或包含它的 `.wasm` 文件)包含:
1. 一个 4 字节的 `WbIL` 魔术字
2. 一个 24 字节的头部,描述了 CLR / 调试数据目录的位置以及类似 COFF 的节区数量
3. 一个节区表(每个条目 16 字节)
4. 节区内容——包括反编译器真正关心的 CLR 元数据块
转换器:
1. 扫描 `WbIL` 魔术字(适用于原始 `.webcil` 和 `.wasm` 封装的有效载荷)。
2. 解析 WebCIL 头部和节区表。
3. 合成一个最小的有效 PE32 封装:DOS 存根、COFF 文件头、PE32 可选头、节区表。
4. 将原始的 CLR 和调试数据目录连接到新的可选头中,使反编译器能在预期的 RVA 处找到元数据。
5. 附加原始节区内容,并按标准 0x200 文件对齐进行填充。
所有节区的名称都设置为 `.text`——反编译器通过数据目录 RVA 定位 CLR 元数据,而非节区名称,因此选择哪个名称无关紧要。
格式参考:[dotnet/runtime — Microsoft.NET.WebAssembly.Webcil](https://github.com/dotnet/runtime/tree/main/src/mono/wasm/Wasi.Build.Tests/build/Microsoft.NET.WebAssembly.Webcil)
## 测试情况
此转换器已针对多个 Blazor 9+ WebAssembly 库进行了端到端验证,包括下面列出的流行开源库。转换后,`ilspycmd` 能将每个库成功反编译回可读的 C# 代码,无错误:
- `Blazor.Diagrams.Core`
- `BlazorMonaco`
- `Google.Protobuf`
- `Grpc.Net.Client`
- `HotChocolate.Abstractions`
`file` 工具将每个输出识别为 `PE32 executable ... Intel i386 Mono/.Net assembly`。
## 要求
- .NET 8 SDK 或更高版本
## 许可证
MIT — 详见 [LICENSE](./LICENSE)。
标签:AI工具, Blazor支持, C#代码, .NET开发, PE文件, URL提取, VPS部署, WebCIL格式, 云资产清单, 单文件工具, 反编译, 反编译器兼容性, 工具链, 文件格式处理, 文件转换, 无依赖, 软件分析, 逆向工程