Reflector: Get the secret inside .NET assemblies.

原创 2004年06月29日 12:33:00

Reflector: Get the secret inside .NET assemblies.

Updated on Friday, October 29, 2004

Writen by Allen Lee

用.NET编程的朋友应该都知道ILDASM的大名吧,这里为大家介绍另一个名为Reflector的好东东。为了了解Reflector,我特意写了一个代码片断(这里只给出用C#写的Main方法的代码):

 

None.gifstatic void Main(string[] args)
ExpandedBlockStart.gif
{
InBlock.gif    List
<string> strList = new List<string>();
InBlock.gif
InBlock.gif    
if (args.Length != 0)
ExpandedSubBlockStart.gif    
{
InBlock.gif        
foreach (string arg in args)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
switch (arg)
ExpandedSubBlockStart.gif            
{
InBlock.gif                
case "IL":
InBlock.gif                    Console.WriteLine(
"IL");
InBlock.gif                    strList.Add(
"IL");
InBlock.gif                    
break;
InBlock.gif                
case "C#":
InBlock.gif                    Console.WriteLine(
"C#");
InBlock.gif                    strList.Add(
"C#");
InBlock.gif                    
break;
InBlock.gif                
case "VB.NET":
InBlock.gif                    Console.WriteLine(
"VB.NET");
InBlock.gif                    strList.Add(
"VB.NET");
InBlock.gif                    
break;
InBlock.gif                
case "Delphi":
InBlock.gif                    Console.WriteLine(
"Delphi");
InBlock.gif                    strList.Add(
"Delphi");
InBlock.gif                    
break;
InBlock.gif                
default:
InBlock.gif                    Console.WriteLine(
"Invalid Option");
InBlock.gif                    
break;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
else
ExpandedSubBlockStart.gif    
{
InBlock.gif        Console.WriteLine(
"No command line args!");
InBlock.gif        Console.WriteLine(
"Press any key to end.");
InBlock.gif        Console.ReadLine();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
foreach (string str in strList)
InBlock.gif        Console.WriteLine(str);
ExpandedBlockEnd.gif}

 

将上面的代码进行编译,并命名为ReflectorLab.exe。然后我们运行Reflector,一开始它的界面是:

o_Reflector.JPG

接着,我们打开菜单:File|Open,找到并选择刚刚编译的程序集,该程序集将会被加入到程序集列表,打开ReflectorLab的树,找到Main(string[]):Void这个方法,右击并选择Disassembler,将会得到下图的反编译代码:

o_Disassembler.JPG

现在截取反编译后的Main方法完整代码如下:

 

None.gifstatic void Main(string[] args)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    List
<string> strList = new List<string>();
InBlock.gif
InBlock.gif    
if (args.Length != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
foreach (string arg in args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
switch (arg)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
case "IL":
InBlock.gif                    Console.WriteLine(
"IL");
InBlock.gif                    strList.Add(
"IL");
InBlock.gif                    
break;
InBlock.gif                
case "C#":
InBlock.gif                    Console.WriteLine(
"C#");
InBlock.gif                    strList.Add(
"C#");
InBlock.gif                    
break;
InBlock.gif                
case "VB.NET":
InBlock.gif                    Console.WriteLine(
"VB.NET");
InBlock.gif                    strList.Add(
"VB.NET");
InBlock.gif                    
break;
InBlock.gif                
case "Delphi":
InBlock.gif                    Console.WriteLine(
"Delphi");
InBlock.gif                    strList.Add(
"Delphi");
InBlock.gif                    
break;
InBlock.gif                
default:
InBlock.gif                    Console.WriteLine(
"Invalid Option");
InBlock.gif                    
break;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.WriteLine(
"No command line args!");
InBlock.gif        Console.WriteLine(
"Press any key to end.");
InBlock.gif        Console.ReadLine();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
foreach (string str in strList)
InBlock.gif        Console.WriteLine(str);
ExpandedBlockEnd.gif}

 

反编译的代码在功能效果上与原代码是相同的,但是个人认为反编译的代码的风格却不怎么棒,尤其是充满goto语句,乍一看我真的晕了过去。代码把原来的switch条件块换成if条件块,将foreach循环块换成while循环块。我猜这是由于它是从IL那里翻译出来的,而IL就是一门基于堆栈的语言,在IL里面没有流程控制语句,全部使用goto + Label模拟,于是得到这样的结果。

除此之外,我还发现一些很特别的东西,请留意这一句:text3 = string.IsInterned(text3); 它其实反映了.NET的字符串处理方式是使用了一种叫做字符串驻留(String Interning)的技术,该技术是为了减轻字符串的操作为系统带来的性能损失(详细请参见《Microsoft .NET框架程序设计(修订版)》的262页)。另外我们看到原代码最后的foreach被翻译成一个try...finally块,在try里面实现foreach的功能,然后再finally里面自动为每一个enumerator试着调用IDisposable接口来释放资源,真是想得周到相信对应的IL也会有同样的“设施”,如果你懂IL的话,而你又肯定在这里不需要这样一个finally的话,那么你可以手动优化一下了,呵呵。

翻译后的代码是有点复杂和混乱,不过,你可以从中窥探.NET的(部分)运行机制(而这种窥探原本是应该使用IL的),并了解到简单的C#代码背后,编译器在默默地为我们作了不少的工作!最后,我们还会惊喜地发现,Reflector不但支持反汇编成C#,还支持IL、VB.NET、Delphi,这下子爽了,我们可以比较并学习这些语言,以前我们用ILDASM来反汇编C#写的程序来学习IL,现在我们可以用Reflector反汇编C#写的程序来学习VB.NET和Delphi啦!当然,由于篇幅的问题,我不可以再往里面灌水(依次加入IL、VB.NET、Delphi反编译的代码)。

另外,你会发现这些源代码的某些地方,通常是类型名称或者方法名称又或者属性会是一个连接,按下去看看有什么事发生!是不是连接到该东西(类型或者方法或者属性)的.NET基类库的反编译代码上了?

最后,在文章的结束,我还有一个惊喜给你,就是Reflector本身是一个.NET程序,这意味着它还可以反汇编它自己,不信的话你可以试试看!

噢,补充一点,当你运行Reflector后,它会在它所在的文件夹会生成一个叫Reflector.cfg的文件,这个不是XML文件,是一种INI格式的配置文件,请留意该文件的[AssemblyLoader]区段,有什么发现了没有?好了,这次的介绍就到此为止,希望你发现更多的东西来跟我分享!

 

【C#】 .NET Reflector 安装与破解

首先解释一下   .NET Reflector 主要是两个版本:Standard(标准版)和VSPRO(VSPRO版)。他们的区别是: Standard版只能在.NET Reflector软件中查...
  • ldy597321444
  • ldy597321444
  • 2017年09月21日 14:00
  • 445

.net reflector 8.3.0.93激活

看.net之美的时候经常在书中看到用.net felector激活来学习代码的例子。所以自己也下载了一个。在激活的时候遇到了点问题,写篇博客记录下。 第一步 断网 打开注册机,点击generat...
  • ironxue
  • ironxue
  • 2014年11月30日 18:59
  • 3768

.NET Reflector 版本问题和破解方法

.NET Reflector 主要是两个版本:Standard(标准版)和VSPRO(VSPRO版)。他们的区别是: Standard版只能在.NET Reflector软件中查看反编译出来的代码,而...
  • dongfanglanyi
  • dongfanglanyi
  • 2017年03月21日 23:17
  • 1539

.NET Reflector 8.5.0.179(带注册机及说明)

这个不错安利一下:转载地址:点击打开链接 .NET Reflector是一个.NET工具。.NET开发人员用它来反编译和观察内在内容,了解应用程序接口(API)、组件、框架以及所使用的所有关键代...
  • amohan
  • amohan
  • 2016年03月22日 13:05
  • 6122

.NETReflector的破解

.NET Reflector是由微软员工Lutz Roeder编写的.net反编译工具。其主要功能是能够将C#, Visual Basic 和 IL程序反编译成汇编程序进行分析查看。即使没有用在反...
  • chaixinke
  • chaixinke
  • 2016年12月17日 12:44
  • 1543

Reflector使用详解

Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual ...
  • lgx040605112
  • lgx040605112
  • 2011年02月22日 14:28
  • 20741

VS2010安装和卸载.NET Reflector方法

最近正在学习F#,使用的环境是VS2010。感觉.NET Reflector是个非常好的工具。对初次接触NET框架的用户帮助非常大。   下面就.NET Reflector集成到VS201...
  • lileixun1987
  • lileixun1987
  • 2012年06月06日 09:10
  • 2443

.NET Reflector Visual Studio Extension

之前用反编译工具都是单独的一个exe文件,如:ILSpy。还需要从项目中将dll或exe拷贝下来,再放进去。此时浪费了很多的步骤不算,我还不知道此方法,类是否是我所调用的哪一个类或方法。那么我多么希望...
  • younghaiqing
  • younghaiqing
  • 2017年05月18日 10:33
  • 787

强大的.NET反编译工具Reflector及插件

 刚接触.net 时就听说 Reflector这个强大反编译工具呢,只是一直没有去使用他. 今天update跟我说Reflector如何,如何有用,用的如何,如何爽,还得意的说反编译了不少DLL......
  • JavaProgramers
  • JavaProgramers
  • 2006年10月31日 15:50
  • 21915

.NET Reflector 7.6.1.824安装及破解(刚试了,绝对能用)

http://blog.csdn.net/etzrp/article/details/8516659
  • u014683488
  • u014683488
  • 2015年11月21日 21:51
  • 526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reflector: Get the secret inside .NET assemblies.
举报原因:
原因补充:

(最多只允许输入30个字)