前言
在項目的進行中有時會碰到需要去了解由第三方所開發的程序代碼或者因為年久已經遺失原始碼的程序,由於因為是別人寫的所以我們並沒有原始碼可以直接閱讀,碰到這種情況我們就需要去反編譯這些程序及 DLL 檔案。
首先大概介紹一下 DLL 是什麼,DLL 全名是 Dynamic Linking Library (動態鏈接庫),當你使用 .NET 開發應用程序時,使用的是網站項目或類別庫時,當項目建置完成後即會在項目底下的 Bin 數據夾中產生將你所撰寫項目中所有的 Class 檔案編譯成 DLL 檔案,而如果開發的是共享工具類別庫,就能夠將此 DLL 檔案提供給多個應用程序與網站參考使用。
但 DLL 檔案是編譯過後的檔案,一般情況下是無法得知內部撰寫的程序代碼,所以在此就必須要使用反編譯的工具來協助去窺探 DLL 內的原始碼,在此要注意一點,DLL 檔案是可以被反編譯的,所以不要以為將程序寫成 DLL 檔案後別人就無法可以得知內容,但如果真的要隱藏 DLL 的內容,可以透過混淆 DLL 的方式來將 DLL 檔案內的程序代碼搞得亂七八糟,增加被反編譯後閱讀的困難度。
建立一個類別庫
在反編譯 DLL 之前我們先建立一個類別庫來供之後反編譯使用,開啟 VS 建立一個類別庫項目,如下
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 下載安裝檔案
選擇到 SalaryHelper 後,右邊的分隔窗口就會顯示該類別反編譯後的程序代碼,如下
反編譯的程序代碼