赞
踩
在本文中,我们将概述目前可用的一系列免费的.NET反编译器。我们只专注于完全免费的完整版本工具,可以在非商业和商业环境中免费运行。如果一个软件工程师在家里投入时间和精力来学习和培养技能,而这些工具只对非商业环境是免费的,然后在他的工作场所发现公司不打算购买该特定工具,那就是浪费时间和精力。
以下是引起我们注意的免费.NET反编译器列表:
为了测试反编译器,我们创建了一个小的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");
- }
- }
您可以从命令行启动它:
基本装配视图:
这是AlphaAssembly.A.PrintMessage()方法的IL代码:
这是元数据信息视图:
当我启动应用程序并尝试加载我的 AlphaAssembly.dll 时,我得到了一个非常不愉快的窗口:
它希望我将其指向.NET 7。这是我解决它的方法:
下面是基本的装配体视图:
这是在IL中的AlphaAssembly.A类:
这是C#中的AlphaAssembly.A类:
当我们尝试逆向工程BetaAssembly到C#项目中时,我们得到了这个:
下面是基本的装配体视图:
以下是IL中的AlphaAssembly.A类:
下面是 C# 中的AlphaAssembly.A类:
我一直在寻找是否可以将BetaAssembly.dll逆向工程到C#项目中,但看不到这是不可能的。
另一个好处是它可以向您显示文件/程序集的PE格式标头:
花哨的是,即使您没有源代码,您也可以调试程序集。下面是一个屏幕截图,我们将断点放入反向工程代码中,并将程序集运行到断点。
这是一件非常奇特的事情。特别是对于某些应用程序的逆向工程。可以在调试器中监视变量的状态。
如果需要,可以反编译为C#或VB.NET。
下面是基本的装配体视图:
这是IL中的AlphaAssembly.A类:
这是C#中的AlphaAssembly.A类:
非常奇特的是,您甚至可以选择要查看的C#风格/版本。这可能非常有趣。
当我们尝试逆向工程BetaAssembly到C#项目中时,它奏效了:
但是我们无法立即构建该项目。我们遇到了一些构建错误。
另一个好处是它可以向您显示文件/程序集的PE格式标头。只是他们将所有内容隐藏在通用名称“Metadata”下。
下面是基本的装配体视图:
这是IL中的AlphaAssembly.A类:
这是C#中的AlphaAssembly.A类:
非常花哨的是,您可以选择要查看的C#的低级/高级版本。这可能非常有趣。
当我们尝试逆向工程BetaAssembly到C#项目中时,它奏效了:
但是我们无法立即构建该项目。我们遇到了一些构建错误。
然后我查看了项目文件:
看起来很奇怪,似乎它创建了一个版本为7.0的.NET Framework样式项目。谁知道这里发生了什么?但这不可用。
另一个好处是它可以向您显示文件/程序集的PE格式标头。只是他们将所有内容隐藏在通用名称“Metadata”下。
它可以创建一些不错的依赖关系图。
另一个不错的功能是,当您将鼠标悬停在某些IL指令上时,您会得到有关该指令的一些提示。
我个人最喜欢的是:
如果您正在寻找一个稳定、功能丰富、漂亮的图形界面和维护良好的应用程序,dotPeek是您的选择。这是您唯一需要的.NET反编译器,您可以在家中和您将工作的任何工作场所自由使用它。
但是,另一个给人留下良好印象的应用程序是ILSpy (Releases · icsharpcode/ILSpy · GitHub )。它支持反编译为所选版本的C#,因此在分析和比较不同版本的C#语言时非常有用。
如果要调试没有源代码的.NET应用程序,则唯一提供的反编译器是dnSpyEx(Releases · dnSpyEx/dnSpy · GitHub )。
但是,当然,偏好和意见不同,因此每个人都有权选择自己喜欢的工具并随意使用它。
https://www.codeproject.com/Articles/5355807/NET-5-Free-Decompilers
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。