原文地址:http://www.it165.net/pro/html/201310/7383.html
-
前言
在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序,由于因为是别人写的所以我们并没有原始码可以直接阅读,碰到这种情况我们就需要去反编译这些程序及 DLL 档案。
首先大概介绍一下 DLL 是什么,DLL 全名是 Dynamic Linking Library (动态链接库),当你使用 .NET 开发应用程序时,使用的是网站项目或类别库时,当项目建置完成后即会在项目底下的 Bin 数据夹中产生将你所撰写项目中所有的 Class 档案编译成 DLL 档案,而如果开发的是共享工具类别库,就能够将此 DLL 档案提供给多个应用程序与网站参考使用。
但 DLL 档案是编译过后的档案,一般情况下是无法得知内部撰写的程序代码,所以在此就必须要使用反编译的工具来协助去窥探 DLL 内的原始码,在此要注意一点,DLL 档案是可以被反编译的,所以不要以为将程序写成 DLL 档案后别人就无法可以得知内容,但如果真的要隐藏 DLL 的内容,可以透过混淆 DLL 的方式来将 DLL 档案内的程序代码搞得乱七八糟,增加被反编译后阅读的困难度。
建立一个类别库
在反编译 DLL 之前我们先建立一个类别库来供之后反编译使用,开启 VS 建立一个类别库项目,如下
接着建立一个 SalaryHelper 的 Class 档案用来计算薪资金额,如下
而 SalaryHelper Class 的内容就简单的撰写一个方法并回传薪资金额,如下01.
namespace
Tools
02.
{
03.
public
class
SalaryHelper
04.
{
05.
public
decimal
GetMySalary()
06.
{
07.
return
22000;
08.
}
09.
}
10.
}
最后在建立一个 ConsoleApplication 将 Tools 类别库加入参考,并且呼叫 GetMySalary() 方法取得薪资,如下
01.
namespace
ConsoleApp
02.
{
03.
class
Program
04.
{
05.
static
void
Main(
string
[] args)
06.
{
07.
Tools.SalaryHelper helper =
new
Tools.SalaryHelper();
08.
Console.WriteLine(
09.
string
.Format(
"My Salary is {0}"
, helper.GetMySalary().ToString()));
10.
Console.Read();
11.
}
12.
}
13.
}
执行结果如下
使用 IL 反组译工具
在安装 Visual Studio 时通常会一并安装 Windows SDK Tools,在 Windows SDK Tools 中有一个 IL 反组译工具可以将 DLL 档案反编译成中间语言,如下
透过 IL反组译工具 将 DLL 反编译成中间语言后就能够与原始码进行对应,不过此中间语言实在非常不亲切,所以我们将改使用其它的工具来进行反编译动作。
用来反编译的工具中比较常听到的就是 Redgate .NET Reflector 与 Telerik .NET Decompiler 此两款工具,.NET Reflector 此工具是需要收费的工具,但是功能还蛮强大的,如果有经常频繁深入的使用时建议可以购买此款工具,而 .NET Decompiler 则是免费的反编译工具,功能虽没 .NET Reflector 强大,但是是免费的先够用就好啦,以下就用此工具来进行示范。
使用 Telerik .NET Decompiler 工具反编译程序代码
首先进入下载网址点选 Free Download 下载安装档案
下载完成后就可以进行安装,下一步下一步....的点到完成
安装完成后到 「开始」→「所有程序」→「Telerik」找到 Telerik JustDecompile 程序执行,如下
开启 JustDecompile 程序后,点选上方工具列的 「Open...」→「File(s)...」寻找到我们建立的 Tools DLL 档案开启
开启后展开的树状目录如下,并且在 Tools 命名空间中找到我们撰写的 SalaryHelper Class
选择到 SalaryHelper 后,右边的分隔窗口就会显示该类别反编译后的程序代码,如下
反编译的程序代码
原始的程序代码
透过 .NET Decompiler 工具将 DLL 档案反编译后,是不是发现两着的相似度很高且非常亲切呢 :P,另外此工具也能够将反编译的程序代码转换为其它语言的代码,在上方的工具列上可以看到一个 C# 的下拉选单,点击后可选择 C#、VB、IL 语言
若你是撰写 VB 语言的,可以将 C# 改成 Visual Basic ,修改后反编译的代码就会变成 Visual Basic 语言的程序代码,是不是很方便呢。
使用此工具还有还有还有一个很重要的功用是可以去看 .NET Framework 实作的类别库!如果是在 Open 的时候选择的是 Load Framework 就可以选择已安装的 .NET Framework 开启来阅读,如下
如此就能够看到 .NET Framework 类别库中底层去实作功能的做法,以上就是一个简单使用的方法,供各位有需要的人作为参考啦。