1. 简介
在本文中,我们将概述目前可用的一系列免费的.NET反编译器。我们只专注于完全免费的完整版本工具,可以在非商业和商业环境中免费运行。如果一个软件工程师在家里投入时间和精力来学习和培养技能,而这些工具只对非商业环境是免费的,然后在他的工作场所发现公司不打算购买该特定工具,那就是浪费时间和精力。
1.1. 测试的工具
以下是引起我们注意的免费.NET反编译器列表:
- Ildasm.exe(随Visual Studio 2022一起提供)
- Telerik justDecompile (JustDecompile .NET Assembly Decompiler & Browser - Telerik)
- dnSpyEx (Releases · dnSpyEx/dnSpy · GitHub)
- ILSpy (Releases · icsharpcode/ILSpy · GitHub)
- JetBrains dotPeek (dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains)
2. 测试申请
为了测试反编译器,我们创建了一个小的C#11/.NET7项目由2个组件组成。解决方案如下所示:
这是原始代码:
//======================================
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一起自动安装。
- 网站:Ildasm.exe (IL Disassembler) - .NET Framework | Microsoft Learn
- 平台:Windows
- 许可证:Visual Studio许可证
3.2. 概述
您可以从命令行启动它:
基本装配视图:
这是AlphaAssembly.A.PrintMessage()方法的IL代码:
这是元数据信息视图:
3.3. 印象
- 许可证不是免费的,但它随Visual Studio一起提供,因此大多数.NET开发人员都会拥有它。
- 非常基本的功能,几乎处于“概念验证”级别
- 只需启用IL查看,无需反编译为C#代码
4. Telerik justDecompile
4.1. 详情
- 产品:justDecompile
- 公司:Telerik
- 网站:JustDecompile .NET Assembly Decompiler & Browser - Telerik
- 平台: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的延续)
- 公司:开源
- 网站: GitHub - dnSpyEx/dnSpy: Unofficial revival of the well known .NET debugger and assembly editor, 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
- 网站:GitHub - icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
- 平台:Linux/Mac/Windows
- 许可证:MIT许可证。
- 注意:它在Microsoft商店中作为Visual Studio Extension提供。
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
- 公司:JetBrains: Essential tools for software developers and teams
- 网站:dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains
- 平台: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 (dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains )
如果您正在寻找一个稳定、功能丰富、漂亮的图形界面和维护良好的应用程序,dotPeek是您的选择。这是您唯一需要的.NET反编译器,您可以在家中和您将工作的任何工作场所自由使用它。
但是,另一个给人留下良好印象的应用程序是ILSpy (Releases · icsharpcode/ILSpy · GitHub )。它支持反编译为所选版本的C#,因此在分析和比较不同版本的C#语言时非常有用。
如果要调试没有源代码的.NET应用程序,则唯一提供的反编译器是dnSpyEx(Releases · dnSpyEx/dnSpy · GitHub )。
但是,当然,偏好和意见不同,因此每个人都有权选择自己喜欢的工具并随意使用它。
9. 参考资料
- [1] Ildasm.exe (IL Disassembler) - .NET Framework | Microsoft Learn
- [2] JustDecompile .NET Assembly Decompiler & Browser - Telerik
- [3] GitHub - dnSpyEx/dnSpy: Unofficial revival of the well known .NET debugger and assembly editor, dnSpy
- [4] GitHub - icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
- [5] dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains
https://www.codeproject.com/Articles/5355807/NET-5-Free-Decompilers