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格式, 云资产清单, 单文件工具, 反编译, 反编译器兼容性, 工具链, 文件格式处理, 文件转换, 无依赖, 软件分析, 逆向工程