《Inside Microsoft IL Assembler》學習筆記3:簡述PE檔案

來源:互聯網
上載者:User
前文索引:
(1)《Inside Microsoft IL Assembler》學習筆記1:初步認識IL代碼 
(2)《Inside Microsoft IL Assembler》學習筆記2:讓IL代碼簡短些 

  託管模組(managed module)的檔案格式是標準的windows PE格式。所以,在深入瞭解託管模組之前,稍微對PE檔案格式做一點瞭解是很有必要的。當然,PE檔案格式誕生於十幾年前,關於它的描述已經很多(最經典的莫過於 《Peering Inside the PE: A Tour of the Win32 Portable Executable File Format》),筆者沒有必要在這裡再做重複。只是簡單把筆者認為比較重要的內容大體列一下(主要參考資料還包括Iczelion的PE教程),主要還是為了能讓自己的筆記內容完整些,詳細的知識還需要您參考其他資料(特別是如果您還不清楚諸如“RVA和VA之間的區別”這樣的基礎概念的話)。

1.兩個狀態。
  PE檔案在使用的時候會被整個直接載入到某個虛擬記憶體地址,在剛剛載入到記憶體的時候,這個檔案在記憶體裡的映像和它原本儲存在磁碟上的靜態狀態沒有任何區別。所以,PE雖然是一個靜態物理檔案,但這個檔案的目的是為了讓OS能夠輕鬆的運行它,在這一點上,它的靜態和動態結構是完全一致的。當然,後面還要做一些其他動作,把這個PE和其他的外部環境(比如這個PE的調用者)關聯起來。總之,在思考這個檔案結構的時候,靜動態結構的一致性是很值得注意的。

2.PE載入點,實際虛擬位址的計算方式。
  在PE檔案內部記錄了一個首選的載入地址(虛擬記憶體地址),但這個地址不是必須的(它可能已經被別的進程佔用了),所以PE檔案可以載入到進程空間的任何地方(這個實際的載入位置被稱為基地址base address)。由於這點,必須有一個方法來指定地址而不依賴於pe載入點的地址。為了避免把記憶體位址寫入程式碼進pe檔案,提出了RVA(相對虛擬位址)。RVA是一個簡單的相對於PE載入點的記憶體位移。比如,PE載入點為0X400000,那麼代碼節中的地址0X401000的RVA為
(target address) 0x401000 - (load address)0x400000 = (RVA)0x1000。
  把RVA加上PE的載入點的實際地址就可以把RVA轉化實際地址。因此,對於PE檔案的內部定址(也就是當PE載入到記憶體中以後,如何定址到PE內的每一個元素),需要關注的事情其實很少:這個PE檔案被載入到哪個虛擬位址(基地址base address)上,然後PE檔案內部的每個元素就會根據基地址和儲存在PE中的相對位移量(RVA)去定址。從計算方法上說,VA-base address = RVA。所以,只要我們得到了RVA和base address,就能在運行時算出VA(實際載入的虛擬位址的值)。

3.PE中的主要結構:段落
  每一個PE檔案都分為若干段落(section),有的段落存放被程式聲明並直接使用的代碼和資料,有的段落存放一些需要被OS知道的資訊。段落靠段落表(section table)來定位。在PE頭和PE中包含的資料、代碼之間,有一個段落表,指向後面的每一個section。但需注意的是,這種“指向”並不是指向section在靜態PE檔案中的位置,而是PE被載入到進程的虛擬記憶體空間之後的真實記憶體位址。

4.引入表,引出表
  如果一個PE檔案是完全獨立的(它不需要引入其他模組的任何功能,也不需要提供功能給其他模組使用),那麼這個檔案的內部定址很簡單,只要你理解了Virtual Address, Base Address, RVA這些概念之後就很容易理解它的定址過程;可惜的是,大部分情況下,PE檔案都是需要“引入函數”的。一個引入函數是被某模組調用的但又不在調用者模組中的函數,因而命名為"import(引入)"。引入函數實際位於一個或者更多的DLL裡。調用者模組裡只保留一些函數資訊,包括函數名及其駐留的DLL名。在PE檔案的data directory數組第二項就是引入表地址。引入表實際上是一個 IMAGE_IMPORT_DESCRIPTOR 結構數組。每個結構包含PE檔案引入函數的一個相關DLL的資訊。比如,如果該PE檔案從10個不同的DLL中引入函數,那麼這個數組就有10個成員。該數組以一個全0的成員結尾。

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.