[.NET] 使用 .NET JustDecompile 來反編譯你的程式碼

介紹當碰到需要反編譯程式碼時,可以使用哪些方法進行反編譯 (IL反組譯工具、.NET Reflector、.NET Decomplier)

前言


  在專案的進行中有時會碰到需要去瞭解由第三方所開發的程式碼或者因為年久已經遺失原始碼的程式,由於因為是別人寫的所以我們並沒有原始碼可以直接閱讀,碰到這種情況我們就需要去反編譯這些程式及 DLL 檔案。

 

  首先大概介紹一下 DLL 是什麼,DLL 全名是 Dynamic Linking Library (動態連結程式庫),當你使用 .NET 開發應用程式時,使用的是網站專案或類別庫時,當專案建置完成後即會在專案底下的 Bin 資料夾中產生將你所撰寫專案中所有的 Class 檔案編譯成 DLL 檔案,而如果開發的是共用工具類別庫,就能夠將此 DLL 檔案提供給多個應用程式與網站參考使用。

 

  但 DLL 檔案是編譯過後的檔案,一般情況下是無法得知內部撰寫的程式碼,所以在此就必須要使用反編譯的工具來協助去窺探 DLL 內的原始碼,在此要注意一點,DLL 檔案是可以被反編譯的,所以不要以為將程式寫成 DLL 檔案後別人就無法可以得知內容,但如果真的要隱藏 DLL 的內容,可以透過混淆 DLL 的方式來將 DLL 檔案內的程式碼搞得亂七八糟,增加被反編譯後閱讀的困難度。

 

建立一個類別庫


  在反編譯 DLL 之前我們先建立一個類別庫來供之後反編譯使用,開啟 VS 建立一個類別庫專案,如下

 

  接著建立一個 SalaryHelper 的 Class 檔案用來計算薪資金額,如下

 

  而 SalaryHelper Class 的內容就簡單的撰寫一個方法並回傳薪資金額,如下


namespace Tools
{
    public class SalaryHelper
    {
        public decimal GetMySalary()
        {
            return 22000;
        }
    }
}

 

  最後在建立一個 ConsoleApplication 將 Tools 類別庫加入參考,並且呼叫 GetMySalary() 方法取得薪資,如下


namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Tools.SalaryHelper helper = new Tools.SalaryHelper();
            Console.WriteLine(
                string.Format("My Salary is {0}", helper.GetMySalary().ToString()));
            Console.Read();
        }
    }
}

 

  執行結果如下

 

使用 IL 反組譯工具


  在安裝 Visual Studio 時通常會一併安裝 Windows SDK Tools,在 Windows SDK Tools 中有一個 IL 反組譯工具可以將 DLL 檔案反編譯成中間語言,如下

 

  透過 IL反組譯工具 將 DLL 反編譯成中間語言後就能夠與原始碼進行對應,不過此中間語言實在非常不親切,所以我們將改使用其他的工具來進行反編譯動作。

 

  用來反編譯的工具中比較常聽到的就是 Redgate .NET ReflectorTelerik .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 類別庫中底層去實作功能的做法,以上就是一個簡單使用的方法,供各位有需要的人作為參考啦。

 

參考資料


Ildasm.exe (MSIL 反組譯工具)

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)