.NET – 5款免费反编译器
5款免费.NET反编译器概述
1. 引言
在本文中,我们将概述目前可用的部分免费.NET反编译器。我们只关注完全免费的完整版工具,这些工具可以在非商业和商业环境中免费运行。如果一名软件工程师投入时间和精力在家中学习并使用某个仅限非商业环境免费的工具来构建技能,然后在他工作的地方发现公司不打算购买该特定工具,那么时间和精力就被浪费了。
1.1. 测试工具
以下是引起我们注意的免费.NET反编译器列表:
- Ildasm.exe(随Visual Studio 2022提供)
- Telerik JustDecompile(https://www.telerik.com/products/decompiler.aspx)
- dnSpyEx(https://github.com/dnSpyEx/dnSpy/releases)
- ILSpy(https://github.com/icsharpcode/ILSpy/releases)
- JetBrains dotPeek(https://www.jetbrains.com/decompiler/)
2. 测试应用程序
为了测试反编译器,我们创建了一个由2个程序集组成的小型C#11/.NET7项目。解决方案如下所示:
这是原始代码:
//======================================
namespace AlphaAssembly
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine(Resource1.HW);
A a2=new A2();
a2.PrintMessage();
A a3 = new A3();
a3.PrintMessage();
B b2 = new B2();
b2.PrintMessage();
B b3 = new B3();
b3.PrintMessage();
}
}
public class A
{
public virtual void PrintMessage()
{
Console.WriteLine(Resource1.HWA);
}
}
public class A2:A
{
public override void PrintMessage()
{
Console.WriteLine(Resource1.HWA2);
}
}
public class A3 : A
{
public override void PrintMessage()
{
Console.WriteLine(Resource1.HWA3);
}
}
//======================================
namespace BetaAssembly
public class B
{
public virtual void PrintMessage()
{
Console.WriteLine("Hello World from B");
}
}
public class B2 : B
{
public override void PrintMessage()
{
Console.WriteLine("Hello World from B2");
}
}
public class B3 : B
{
public override void PrintMessage()
{
Console.WriteLine("Hello World from B3");
}
}
3. Ildasm.exe
3.1. 详情
- 产品: Ildasm.exe IL反汇编器
- 公司: Microsoft。此工具随Visual Studio自动安装。
- 网站: https://learn.microsoft.com/en-us/dotnet/framework/tools/ildasm-exe-il-disassembler
- 平台: Windows
- 许可证: Visual Studio许可证
3.2. 概述
您可以从命令行启动它:
基本程序集视图:
这是AlphaAssembly.A.PrintMessage()
方法的IL代码:
这是元数据信息视图:
3.3. 印象
- 许可证不是免费的,但它随Visual Studio提供,所以大多数.NET开发人员都会拥有它。
- 功能非常基本,几乎处于“概念验证”级别。
- 只支持IL查看,不支持反编译为C#代码。
4. Telerik JustDecompile
4.1. 详情
- 产品: JustDecompile
- 公司: Telerik
- 网站: https://www.telerik.com/products/decompiler.aspx
- 平台: Windows
- 许可证: 网站上写着:免费。对所有人。永远。
4.2. 概述
当我启动应用程序并尝试加载我的AlphaAssembly.dll时,我得到了一个非常不愉快的窗口:
它要求我指向.NET 7。我是这样解决的:
这是基本的程序集视图:
这是IL中的类AlphaAssembly.A
:
这是C#中的类AlphaAssembly.A
:
当我们尝试将BetaAssembly
反向工程到C#项目时,我们得到了这个:
4.3. 印象
- 这个应用程序似乎不再维护了。它不知道如何处理.NET 7。
- 它仍然可以在文件级别提供有用的反编译到基本C#代码的功能。
- 现有选项功能齐全但有限。没有其他产品中那么多花哨的工具/选项。
- 对于“Telerik”这样的大公司来说,这个应用程序状况如此糟糕,这很奇怪。他们自称“最快的反编译器。比竞争对手快10倍。”,但实际上,它看起来像一个被遗弃的应用程序。
5 dnSpyEx
5.1 详情
- 产品: dnSpyEx (dnSpy的延续)
- 公司: 开源
- 网站: https://github.com/dnSpyEx/dnSpy
- 平台: Windows
- 许可证: 采用GPLv3许可。
- 注意: GitHub: dnSpyEx是dnSpy项目的非官方延续(分支)
5.2 概述
这是基本的程序集视图:
这是IL中的类AlphaAssembly.A:
这是C#中的类AlphaAssembly.A:
我正在查看是否可以将BetaAssembly.dll反向工程到C#项目,但没有发现这可能。
另一个不错的地方是它可以显示文件/程序集的PE格式头:
一个很酷的功能是,即使没有源代码,您也可以调试程序集。这是一个屏幕截图,我们在反向工程代码中设置了一个断点,并将程序集运行到该断点。
这真的是一个很棒的功能。特别是对于某些应用程序的反向工程。您可以在调试器中监视变量的状态。
如果您愿意,可以反编译为C#或VB.NET。
5.3 印象
- 看起来是一个不错且稳定的反编译器。
- 非常喜欢PE格式头查看器。
- 调试是一个非常棒的功能。
- 有些人会喜欢“反编译到VB.NET”功能,这是许多其他反编译器不提供的。
6. ILSpy
6.1. 详情
- 产品: ILSpy
- 公司: 开源/GitHub
- 网站: https://github.com/icsharpcode/ILSpy#ilspy-------
- 平台: Linux/Mac/Windows
- 许可证: MIT许可证。
- 注意: 它在Microsoft Store中作为Visual Studio扩展提供。
6.2. 概述
这是基本的程序集视图:
这是IL中的类AlphaAssembly.A
:
这是C#中的类AlphaAssembly.A
:
一个非常棒的功能是,您甚至可以选择您想要查看的C#版本/风格。这可能非常有趣。
当我们尝试将BetaAssembly
反向工程到C#项目时,它成功了:
但我们无法立即构建项目。我们遇到了一些构建错误。
另一个不错的地方是它可以显示文件/程序集的PE格式头。只是它们将所有内容都隐藏在通用名称“Metadata
”下。
6.3. 印象
- 该项目似乎定期维护并得到Microsoft的支持。
- 非常棒的反编译到特定C#版本的功能。我非常喜欢这一点。
- 非常喜欢PE格式头查看器。
- 反向工程到VS项目很好,可能需要一些手动微调才能正常工作。
7. JetBrains dotPeek
7.1. 详情
- 产品: dotPeek
- 公司: https://www.jetbrains.com/
- 网站: https://www.jetbrains.com/decompiler/
- 平台: Windows
- 许可证: 网站上写着:dotPeek是一个免费的独立工具。
7.2. 概述
这是基本的程序集视图:
这是IL中的类AlphaAssembly.A
:
这是C#中的类AlphaAssembly.A
:
一个非常棒的功能是,您可以选择您想要查看的C#的低级/高级版本。这可能非常有趣。
当我们尝试将BetaAssembly
反向工程到C#项目时,它成功了:
但我们无法立即构建项目。我们遇到了一些构建错误。
然后我查看了项目文件:
看起来很奇怪,它似乎创建了一个7.0版本的.NET Framework风格的项目。谁知道这里发生了什么?但这无法使用。
另一个不错的地方是它可以显示文件/程序集的PE格式头。只是它们将所有内容都隐藏在通用名称“Metadata
”下。
它可以创建一些漂亮的依赖关系图。
另一个不错的功能是,当您将鼠标悬停在某些IL指令上时,您会得到关于该指令的一些提示。
7.3. 印象
- 感觉非常好,就像一个专业的应用程序,具有许多导航选项。
- 非常棒的反编译到C#的低级/高级的功能。我非常喜欢这一点。
- 非常喜欢PE格式头查看器。
- 反向工程到VS项目有问题,这对于JetBrains这样的大公司来说很奇怪。
- 依赖关系图是一个很好的补充,它们对于项目文档很有用。
8. 结论
我个人最喜欢的是
- JetBrains dotPeek(https://www.jetbrains.com/decompiler/)
如果您正在寻找一个稳定、功能丰富、界面美观且维护良好的应用程序,dotPeek是您的选择。这是您唯一需要的.NET反编译器,您可以在家中和任何工作场所免费使用它。
然而,另一个给我留下好印象的应用程序是ILSpy(https://github.com/icsharpcode/ILSpy/releases)。它支持反编译到选定的C#版本,因此在分析和比较C#语言的不同版本时会很有用。
如果您想在没有源代码的情况下调试.NET应用程序,唯一提供此功能的反编译器是dnSpyEx(https://github.com/dnSpyEx/dnSpy/releases)。
但当然,喜好和观点因人而异,所以每个人都有权选择自己喜欢的工具并随意使用。
9. 参考文献
- [1] https://learn.microsoft.com/en-us/dotnet/framework/tools/ildasm-exe-il-disassembler
- [2] https://www.telerik.com/products/decompiler.aspx
- [3] https://github.com/dnSpyEx/dnSpy
- [4] https://github.com/icsharpcode/ILSpy#ilspy-------
- [5] https://www.jetbrains.com/decompiler/
10. 历史
- 2023年3月1日: 初版