MS.Net CLR 擴充PE結構分析(轉,很不錯的文章)

來源:互聯網
上載者:User
Flier Lu <flier_lu@sina.com.cn>
  
注意:本系列文章在水木清華BBS(smth.org)之.Net版首發,
     轉載請保留以上資訊,發表請與作者聯絡
  
概述
  
    本系列文章,將從系統層角度,通過對MS.Net CLR架構對PE映像結構的擴充的分析

解析MS.Net CLR架構的底層部分運行機制,協助讀者從更深層次理解CLR中某些重要概念
本文讀者應具備基本的Win32編程經驗,瞭解.Net中常見概念意義,並對Win32之PE映像
結構有一定瞭解,具體結構請參看Matt Pietrek於1994.3發表在MSJ的經典文章
《Peering Inside the PE: A Tour of the Win32 Portable Executable
File Format》,與之重複的部分我一概跳過。
    本系列文章,將分為幾個大部分,首先是最重要的MetaData,其次是IL代碼結構,
然後……我還沒想好,呵呵。此外會根據需要穿插一下CLR核心概念、思想、技術的介紹

    至於CLR幾個核心組件之間的關係與互動等問題,我熱切期待TBSoft的大作,
我這裡就不去搶他的話題了,呵呵。
  
前言
  
    對一個優秀Win32程式員來說,對PE結構的瞭解是對Win32架構瞭解的必經之路,
而從Chicago(Win95的開發代號,Win95正式發布以前的文檔對Win95的稱呼)以來,
PE結構就相對穩定,直到MS.Net的出現,才發生了一些不大不小的變化。
    之所以說是不大不小,是因為CLR基本上沒有對PE結構進行改變,只是利用現有PE
結構的優良可擴充性,將其所需的資訊擴充到PE映像中。具體一點說,就是利用了PE結

中的IMAGE_OPTIONAL_HEADER.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR]
來儲存服務於CLR的IMAGE_COR20_HEADER結構。此外的PE結構一律不變。
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR此節,原本是設計用於COM,但不知為何
一直沒有被使用,現在用於儲存.Net資訊的最進階資訊結構。
   我們的分析也將集中在此結構以及相關資訊的分析上。
   IMAGE_COR20_HEADER結構的定義,可以在FrameworkSDK\include\CorHdr.h
檔案中找到,如下:
  
// CLR 2.0 header structure.
typedef struct IMAGE_COR20_HEADER
{
    // Header versioning
    ULONG                   cb;
    USHORT                  MajorRuntimeVersion;
    USHORT                  MinorRuntimeVersion;
  
    // Symbol table and startup information
    IMAGE_DATA_DIRECTORY    MetaData;
    ULONG                   Flags;
    ULONG                   EntryPointToken;
  
    // Binding information
    IMAGE_DATA_DIRECTORY    Resources;
    IMAGE_DATA_DIRECTORY    StrongNameSignature;
  
    // Regular fixup and binding information
    IMAGE_DATA_DIRECTORY    CodeManagerTable;
    IMAGE_DATA_DIRECTORY    VTableFixups;
    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
  
    // Precompiled image info (internal use only - set to zero)
    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
  
} IMAGE_COR20_HEADER;
  
   而詳細的說明,則可以在FrameworkSDK\Tool Developers Guide\docs
目錄中找到。因為要將CLR變為標準,MS這次一反常態,公開大量有價值的文檔,
避免我等浪費時間去逆向過程,呵呵
   此結構雖然欄位較多,但實際上其核心在於MetaData,其他資訊都是圍繞著
MetaData服務。之間的關係,等會再慢慢道來。
   cb是結構大小,MajorRuntimeVersion.MinorRuntimeVersion是版本號碼
指執行此程式所需的最低CLR版本號碼,目前一般設定為1.1。而現在發布的.Net
Framework的CLR版本一般為2.0。
   Flags是Runtime Image描述標誌,描述此映像的執行屬性。如設定位
COMIMAGE_FLAGS_32BITREQUIRED=0x02,則此映像只能在32位系統上執行
對以後的64位CLR無效(MS.Net很大的一個功能就是為以後平滑過渡到64位
平台做準備,想想以前16位平台到32位平台過渡時的混亂,以及現在比以前翻了
n倍的代碼量就恐怖,MS真是未雨綢繆啊,呵呵)。如果設定
COMIMAGE_FLAGS_STRONGNAMESIGNED=0x04,則此映像有strong name
signature(這個東東不知道怎麼翻譯好)。這個strong name signature
在CLR架構裡起到了非常重要的作用。為什麼這麼說呢?因為這個strong name
signature起到Assembly的身份證的作用,它關係到CLR中一大堆概念的實現,
以後我會專門用一章篇幅來介紹他,這裡暫且放下。
   EntryPointToken則是指向IL程式的入口,類似於以前的
IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint的作用,只是以前的
AddressOfEntryPoint是一個RVA直接指向程式入口代碼所在地址,
(不要告訴我你不知道RVA是什麼啊,呵呵,趕快去看Peering Inside the PE)
而現在EntryPointToken指向一個Token。注意,是Token,因為IL代碼是
JIT編譯的,存在於映像中的都是IL形式的P-code(pseudo code),在需要時
才由CLR動態讀取,在記憶體中編譯展開為機器碼(Native Code),進而執行。
因此這裡的程式入口執行的只是一個MethodDef或File表的入口,一個Token而已。
   這裡的MethodDef是一個MetaData表,每行定義一個方法;而File表則是
每行有一個File定義的表,每行包含一個外部檔案的資訊。也就是說,在執行程式時
可以直接編譯執行此映像中的一個方法的IL代碼,也可能是重新導向到另一個檔案,
這就是Assembly作為一個邏輯代碼單元,與傳統DLL之類相比一個很大的不同。
Assembly的概念也非常重要,我不想這裡一下說完,以後專門拿一章出來講好了。
  剩下幾個欄位都是IMAGE_DATA_DIRECTORY類型,這個類型是一個資料區塊
定義結構,在Winnt.h中有定義
typedef struct _IMAGE_DATA_DIRECTORY {
  DWORD   VirtualAddress;
  DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  呵呵,知道RVA的意思了吧 RVA = Relative Virtual Address
  Resources定義CLI資源;StrongNameSignature定義剛剛提到的
strong name signature;此外CodeManagerTable,
ExportAddressTableJumps,MangedNativeHeader都沒用到。
VTableFixups暫且略過,以後用上時再詳細解釋。
  這樣一來,就剩下一個MetaData欄位沒有介紹了,不過這個重中之重的東東,
這次隻言片語是無法介紹了,因為下面會有專門的一整篇——MetaData篇,
用n章的篇幅來詳細剖析,呵呵
  
btw:因為自己以前不是搞Win32底層開發的,實在不知這種文章怎麼寫,
    希望讀者多多提意見,有沒有解釋清楚或者錯誤的地方儘管提出來。
  
    分析.Net的CLR PE映像其實並不是什麼困難的事情,有現成的
    代碼(mono)現成的文檔(Tool Developers Guide)可以看,
    只是代碼比較難看(不習慣unix代碼風格),文檔比較長
    (一共20幾M,poor)而已。我是實在耐不住好奇心才動手分析的,
    希望能夠把自己分析的一些收穫和體會寫出來,節省其他朋友的時間。
  
    希望能夠有充足的時間、精力和耐心完成這個系列文章…… 

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。