`
lovnet
  • 浏览: 6880918 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Reflector: Get the secret inside .NET assemblies.

阅读更多

Reflector: Get the secret inside .NET assemblies.

Updated on Friday, October 29, 2004

Writen by Allen Lee

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

staticvoidMain(string[]args)
{
List
<string>strList=newList<string>();

if(args.Length!=0)
{
foreach(stringarginargs)
{
switch(arg)
{
case"IL":
Console.WriteLine(
"IL");
strList.Add(
"IL");
break;
case"C#":
Console.WriteLine(
"C#");
strList.Add(
"C#");
break;
case"VB.NET":
Console.WriteLine(
"VB.NET");
strList.Add(
"VB.NET");
break;
case"Delphi":
Console.WriteLine(
"Delphi");
strList.Add(
"Delphi");
break;
default:
Console.WriteLine(
"InvalidOption");
break;
}

}

}

else
{
Console.WriteLine(
"Nocommandlineargs!");
Console.WriteLine(
"Pressanykeytoend.");
Console.ReadLine();
}


foreach(stringstrinstrList)
Console.WriteLine(str);
}

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

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

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

staticvoidMain(string[]args)
{
List
<string>strList=newList<string>();

if(args.Length!=0)
{
foreach(stringarginargs)
{
switch(arg)
{
case"IL":
Console.WriteLine(
"IL");
strList.Add(
"IL");
break;
case"C#":
Console.WriteLine(
"C#");
strList.Add(
"C#");
break;
case"VB.NET":
Console.WriteLine(
"VB.NET");
strList.Add(
"VB.NET");
break;
case"Delphi":
Console.WriteLine(
"Delphi");
strList.Add(
"Delphi");
break;
default:
Console.WriteLine(
"InvalidOption");
break;
}

}

}

else
{
Console.WriteLine(
"Nocommandlineargs!");
Console.WriteLine(
"Pressanykeytoend.");
Console.ReadLine();
}


foreach(stringstrinstrList)
Console.WriteLine(str);
}

反编译的代码在功能效果上与原代码是相同的,但是个人认为反编译的代码的风格却不怎么棒,尤其是充满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]区段,有什么发现了没有?好了,这次的介绍就到此为止,希望你发现更多的东西来跟我分享!

分享到:
评论

相关推荐

    [.NET Reflector] .NET Reflector 8.3.3.115 最新版

    5. 将 .NET Reflector 中的激活请求字符串复制,粘贴到注册机第二个文本框中,复制第三个文本框的激活应答字符串,粘贴到.NET Reflector手动激活界面右边文本框中 6. 点击激活按钮,激活成功 ^_^

    Red-Gate.NET.Reflector.v8.0.1.308+注册机+插件

    在提供的压缩包中,"Red-Gate.NET.Reflector.v8.0.1.308.Incl.keygen.With.Addin"可能包含了软件的安装程序、注册机以及某些插件。然而,需要注意的是,使用注册机涉及版权问题,违反了软件许可协议,这种行为不应...

    .NET Reflector 8.3.3.115

    .NET Reflector是一款强大的反编译工具,由Red Gate Software公司开发,主要用于查看、理解和学习.NET框架下编译的代码。它的版本8.3.3.115是针对Visual Studio的一个插件,提供了与Visual Studio 2013、2015和2017...

    Red.Gate.NET.Reflector.v9.0.1.374 破解版

    Red.Gate.NET.Reflector.v9.0.1.374 破解版 内含安装文件、注册机、破解说明

    .dll 文件反编译的工具软件: Reflector for .NET Remotesoft .NET Explorer

    总的来说,Reflector for .NET和Remotesoft .NET Explorer是.NET开发者的重要辅助工具,它们提供了一种深入理解.NET程序集内部工作方式的途径,对于学习、调试和优化代码都极其有用。通过安装这两个工具,开发者可以...

    RedGate.NET.Reflector.VSPro.7.4.1.179破解补丁

    Reflector最新版补丁 RedGate.NET.Reflector.VSPro.7.4.1.179破解补丁

    .NET Reflector 8.5.0.179 官方最新版+注册机(强大的.NET反编译工具)

    1.下载安装原程序,然后运行 Reflector.exe 2.运行注册机,点击 Generate 获得序列号 3.把序列号填写到 Reflector 软件上 4.断开网络,点击 Activate 激活 5.提示说无法连接服务器,点击手动激活 Manually Activate ...

    [开发工具] .NET Reflector 7.6.1.824

    5. 将.NET Reflector中的激活请求字符串复制,粘贴到注册机第二个文本框中,复制第三个文本框的激活应答字符串,粘贴到.NET Reflector手动激活界面右边文本框中 6. 点击激活按钮,激活成功 ^_^

    Red-Gate.NET.Reflector.v8.0.1.308(内含注册机Keygen与注册图解)

    反编译神器 ...5. 将.NET Reflector中的激活请求字符串复制,粘贴到注册机第二个文本框中,复制第三个文本框的激活应答字符串,粘贴到.NET Reflector手动激活界面右边文本框中 6. 点击激活按钮,激活成功

    [开发工具] .NET Reflector 7.6.0.808

    ☆ 资料说明: ☆ ...5. 将.NET Reflector中的激活请求字符串复制,粘贴到注册机第二个文本框中,复制第三个文本框的激活应答字符串,粘贴到.NET Reflector手动激活界面右边文本框中 6. 点击激活按钮,激活成功 ^_^

    [开发工具] .NET Reflector 8.0.2.313 最新版 程序+注册机

    5. 将 .NET Reflector 中的激活请求字符串复制,粘贴到注册机第二个文本框中,复制第三个文本框的激活应答字符串,粘贴到.NET Reflector手动激活界面右边文本框中 6. 点击激活按钮,激活成功 ^_^

    .NET Reflector 8.5.0.179 官方最新版+注册机

    1.下载安装原程序,然后运行 Reflector.exe 2.运行注册机,点击 Generate 获得序列号 3.把序列号填写到 Reflector 软件上 4.断开网络,点击 Activate 激活 5.提示说无法连接服务器,点击手动激活 Manually Activate ...

    Reflector6.6.0.30

    Version 6.6 has been released to extend the expiry date of the last free version of .NET Reflector. Version 6.6 will expire on the 30th of May 2011 with warnings from the 30th of April.

    net反编译Reflector.rar

    将DLL进行反编译 .NET Reflector is a class browser, analyzer....NET Reflector 6 is the last free version of .NET Reflector but, unlike previous free editions, it will not expire or force you to update.

    .Net Reflector(9.0.1.374)内含安装包和破解程序

    1.解压文件夹,启动安装程序ReflectorInstaller.exe...2.安装完毕后,断开本地网络连接,运行安装好的文件.NET Reflector 9.0进入软件激活页面 3.启动破解程序Universal Activator.exe,复制序列号到.NET Reflector进行激活

    [.Net开发利器] .NET Reflector 8.4.0.39

    5. 将.NET Reflector中的激活请求字符串复制,粘贴到注册机第二个文本框中,复制第三个文本框的激活应答字符串,粘贴到.NET Reflector手动激活界面右边文本框中 6. 点击激活按钮,激活成功 ^_^

    Redgate .NET Reflector 10.3.0.1936

    - .NET Reflector supports C# 5, and .NET 4.5. So you can decompile and learn async code. - .NET Reflector decompiles high level C# features such as Iterator blocks, Lambda expressions, and LINQ ...

    反编译软件.NET Reflector 8.0.1.308主程序+注册机+破解说明

    1.下载安装原程序,然后运行 Reflector.exe 2.运行注册机,点击 Generate 获得序列号 3.把序列号填写到 Reflector 软件上 4.断开网络,点击 Activate 激活 5.提示说无法连接服务器,点击手动激活 Manually Activate ...

    red gate .NET Reflector10

    亲测已PJ,可以使用,.NET Reflector 10版本,很好用了。 压缩包内含有PJ说明,注意要断网处理。

Global site tag (gtag.js) - Google Analytics