轉載文章----初識Ildasm.exe——IL反編譯的實用工具

来源:http://www.cnblogs.com/zpfbuaa/archive/2016/03/07/5251733.html
-Advertisement-
Play Games

轉載地址http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要:(路徑:C:\Program Files (x86)\Microsoft SDKs\Windows\v數字.0\bin) 一.前


轉載地址http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html

Ildasm.exe 概要:(路徑:C:\Program Files (x86)\Microsoft SDKs\Windows\v數字.0\bin)

 

一.前言:

     微軟的IL反編譯實用程式——Ildasm.exe,可以對可執行文件(ex,經典的控制台Hello World 的 exe 可執行文件)抽取出 IL 代碼,並且給出命名空間以及類的視圖。在講述如何反編譯之前,有必要從虛擬CPU的角度來看CLR,這樣有助於先從正面瞭解代碼執行過程。

虛擬CPU: 

    .NET 程式,其核心皆為 CLR ,而同時CLR的功能卻與CPU非常相近,其中CLR執行IL代碼(或叫做,IL指令)、操作數據,只不過操作的代碼不同:CPU操作機器語言,而CLR操作IL代碼。

由上,上述講解的是從IL--機器語言的過程,而Ildasm則可以實現將可執行程式(機器語言)--IL代碼,這就是Ildasm的主要功能。 

    在Anytao的《你必須知道的.NET》中對IL代碼專門做了說明,雖然暫時悟不透其"深遠意義",但我還是願意去開始我的IL之旅的,呵呵~。 在此我們先看,Anytao對於掌握(或者瞭解) IL代碼的重要性:

1.通用的語言基礎是.NET運行的基礎,當我們對運行結果有異議的時候,如何透過錶面看本質,IL是必須的基礎; 

2. IL也是更好理解、認識CLR的基礎

3.大量的實例分析是以IL為基礎的,所以瞭解IL,是讀懂他人代碼的必備基礎,同時自己也可以獲得潛移默化的提高; 

    有上述3條影響,足以讓任何一個有追求的人都鼓足勁,去開始IL之旅了(自然包括我,呵呵~)。

 

二 .Ildasm.exe 的使用方法:

在應用Ildasm.exe具體反編譯代碼之前,先附上MSDN對於用Ildasm.exe反編譯的經典幫助示例: 

 

然後我們用Ildasm.exe具體反編譯經典的"Hello World"控制台程式的可執行文件,展現出來的視圖為:

 

 

分析具體IL代碼:

1.MANIFEST清單:

     MANIFEST是一個附加信息列表,主要包含程式集的一些屬性,如程式集名稱、版本號、哈希演算法等;

2.ConsoleApplication1.Program類:

    這才是我們介紹的主角。 

首先是Program類: 代碼為

.class private auto ansi beforefieldinit ConsoleApplication1.Program
       extends [mscorlib]System.Object
{
} // end of class ConsoleApplication1.Program

1).class,表示Program是一個類。並且它繼承自程式集—mscorlib的System.Object類;

2)private,表示訪問許可權;

3)auto,表示程式的記憶體載入全部由CLR來控制;

4)ansi,是為了在沒有托管代碼與托管代碼之間實現無縫轉換。這裡主要指C、C++代碼等;

5)beforefieldinit,是用來標記運行庫(CLR)可以在靜態欄位方法生成後的任意時刻,來載入構造器(構造函數);

 

其次是 .otor方法,代碼為:

複製代碼 .method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
} // end of method Program::.ctor 複製代碼

 

1)cil managed:表示其中為IL代碼,指示編譯器編譯為托管代碼;

2).maxstack:表示調用構造函數.otor期間的評估堆棧(Evaluation Stack) ;

3)IL_0000:標記代碼行開頭;

4)ldarg.0:表示轉載第一個成員參數,在實例方法中指的是當前實例的引用;

5)call:call一般用於調用靜態方法,因為靜態方法是在編譯期就確定的。而這裡的構造函數.otor()也是在編譯期就制定的。而另一指令callvirt則表示調用實例方法, 它是在運行時確定的,因為如前述,當調用方法的繼承關係時,就要比較基類與派生類的同名函數的實現方法(virtual和new),以確定調用的函數所屬的Method Table;

6)ret:表示執行完畢,返回;

 

最後是Main()方法,代碼為:

複製代碼 .method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main 複製代碼

 

1) .entrypoint指令表示CLR載入程式時,是首先從.entrypoint開始的,即從Main方法作為程式的入口函數;

2)ldstr:表示將字元串壓棧,在這裡就是將"Hello World." 壓棧;

3)hidebysig:表示當把此類作為基類,存在派生類時,此方法不被繼承,同上構造函數;

 

   至此,我們對IL代碼的一些指令有了瞭解,也縱觀了IL世界里的概況,呵呵~

 

常用IL指令擴展: 

 

一:創建對象實例的IL指令

關於創建對象的在記憶體分配的機制,在《記憶體探尋1之——值類型和引用類型的記憶體分配機制》 里有了詳細的介紹。而常用的創建對象的IL指令使我們更好理解對象的步驟。其主要有4種:

1.newobj: 用於創建引用類型的對象;

2:ldstr:用於創建String對象變數;

3.newarr:用於創建數組型對象;

4:box:在值類型轉換為引用類型的對象時,將值類型拷貝紙托管堆上分配記憶體; 

 

二:通過IL代碼,更好地理解屬性 

我們在C++中,在典型的類中,都會定義用於控制有效性輸入的Set()函數,以及用於不同方式顯示的Get()函數。然而在C#中,它將Get()函數和Set()結合在一起,剛開始難免會為之混淆。然而若通過 Ildasm.exe對程式反編譯後觀察屬性的本質,即可看到其執行機制,如下圖示(註:選自互聯網):

 

 

由我們前面的分析IL代碼的方法,以及上圖的展示,我們可以看到屬性被重新分為Get()函數和Set()函數。ex,屬性Name,被分解為get_Name()函數和set_Name(String s)函數。這樣我們對其本質就一目瞭然了!至於其屬性的特殊表示形式,只看做是Set()函數和Get()函數的完美結合體就可以了,這也是C#語言的優美體現啊,呵呵~

 

綜述之,我們對反編譯工具Ildasm.exe有了一定認識,最主要的,我們通過它反編譯的IL代碼,對基本的IL指令有了一定的瞭解,也對以後的在把IL代碼作為有力工具 使用的過程中,更向前了一步!然而,這些都還只是IL的基礎,需要繼續深入,呵呵~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 自己編寫Mvvm模式代碼實現一個簡單的登陸畫面。涉及到了INotifyPropertyChanged的實現,ICommand的實現。最重要的還有Xbind
  • 這幾天開始新項目,在AbstractDalFactory反射實例的時候,遇到的問題是load程式集成功,但是Create實例為null. 被反射的程式集名稱和命名空間都為s2s.Dal, 剛開始我在想,會不會是中間的有個點 . 的問題,轉而一想不可能啊,因為我AutoFac依賴註入s2s.BLL對象
  • 最近學習了繼承,多態,集合,設計模式,有一個汽車租憑系統,給大家分享一下: 我們首先來看看我們這個系統的效果 1.做一個項目,我們首先對項目進行分析 根據我們最近學的知識,我們可以看出繼承,多態,集合,設計模式,我們都能用到 我們把所需要的類和簡單模式中的“簡單工廠”的工廠準備好 類圖: 01.車輛
  • 一、系統窗體 1)vehic類 //父類 汽車類 public abstract class Vehicle { //汽車牌照 public string CarID { get; set; } //汽車名 public string Name { get; set; } //顏色 public s
  • 最近在維護一位離職的同事寫的WPF代碼,偶然發現他使用C# string類型的兩個問題,在這裡記錄一下。 1. 使用Trim函數移除字串中的空格、換行符等字元串。 csRet.Trim(new char[] { '\r', '\n', '\t', ' ' });if (!csRet.Equals(s
  • 一、系統窗體 二、思路分析: 我們看見這有三個類分別是:Vehicle 交通工具類父類 Car和Truck分別是Vehicle是它的子類 需要用到繼承和多態、簡單工廠的知識點進行書寫 1)vehic類 public abstract class Vehicle { //無參數 public Vehi
  • 轉載地址:http://www.cnblogs.com/yangmingming/archive/2010/01/27/1657850.html .NET 框架概要: .NET框架,即.NET FrameWork ,其本身作為.NET 技術兩大方面之一。從狹義角度來講,即通常所說的.NET框架。然而
  • 轉載地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662546.html 一:Ildasm.exe簡介 這一微軟VS自帶工具,在上一篇博文《初識Ildasm.exe——IL反編譯的實用工具》中已經做了詳細介紹,這裡不再鰲述; 二
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...