1. 程式人生 > >PE檔案格式詳解(上)

PE檔案格式詳解(上)

Windows NT 3.1引入了一種名為PE檔案格式的新可執行檔案格式。PE檔案格式的規範包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦澀。 
   然而這一的文件並未提供足夠的資訊,所以開發者們無法很好地弄懂PE格式。本文旨在解決這一問題,它會對整個的PE檔案格式作一個十分徹底的解釋,另外,本文中還帶有對所有必需結構的描述以及示範如何使用這些資訊的原始碼示例。 
   為了獲得PE檔案中所包含的重要資訊,我編寫了一個名為PEFILE.DLL的動態連結庫,本文中所有出現的原始碼示例亦均摘自於此。這個DLL和它的原始碼都作為PEFile示例程式的一部分包含在了CD中(譯註:示例程式請在MSDN中尋找,本站恕不提供),你可以在你自己的應用程式中使用這個DLL;同樣,你亦可以依你所願地使用並構建它的原始碼。在本文末尾,你會找到PEFILE.DLL的函式匯出列表和一個如何使用它們的說明。我覺得你會發現這些函式會讓你從容應付PE檔案格式的。

介紹

Windows作業系統家族最近增加的Windows NT為開發環境和應用程式本身帶來了很大的改變,這之中一個最為重大的當屬PE檔案格式了。新的PE檔案格式主要來自於UNIX作業系統所通用的COFF規範,同時為了保證與舊版本MS-DOS及Windows作業系統的相容,PE檔案格式也保留了MS-DOS中那熟悉的MZ頭部。 
   在本文之中,PE檔案格式是以自頂而下的順序解釋的。在你從頭開始研究檔案內容的過程之中,本文會詳細討論PE檔案的每一個組成部分。 
   許多單獨的檔案成分定義都來自於Microsoft Win32 SDK開發包中的WINNT.H檔案,在這個檔案中你會發現用來描述檔案頭部和資料目錄等各種成分的結構型別定義。但是,在WINNT.H中缺少對PE檔案結構足夠的定義,在這種情況下,我定義了自己的結構來存取檔案資料。你會在PEFILE.DLL工程的PEFILE.H中找到這些結構的定義,整套的PEFILE.H開發檔案包含在PEFile示例程式之中。 
   本文配套的示例程式除了PEFILE.DLL示例程式碼之外,還有一個單獨的Win32示例應用程式,名為EXEVIEW.EXE。建立這一示例目的有二:首先,我需要測試PEFILE.DLL的函式,並且某些情況要求我同時檢視多個檔案;其次,很多解決PE檔案格式的工作和直接觀看資料有關。例如,要弄懂匯入地址名稱表是如何構成的,我就得同時檢視.idata段頭部、匯入映像資料目錄、可選頭部以及當前的.idata段實體,而EXEVIEW.EXE就是檢視這些資訊的最佳示例。 
   閒話少敘,讓我們開始吧。

PE檔案結構

PE檔案格式被組織為一個線性的資料流,它由一個MS-DOS頭部開始,接著是一個是模式的程式殘餘以及一個PE檔案標誌,這之後緊接著PE檔案頭和可選頭部。這些之後是所有的段頭部,段頭部之後跟隨著所有的段實體。檔案的結束處是一些其它的區域,其中是一些混雜的資訊,包括重分配資訊、符號表資訊、行號資訊以及字串表資料。我將所有這些成分列於圖1。

圖1.PE檔案映像結構

從MS-DOS檔案頭結構開始,我將按照PE檔案格式各成分的出現順序依次對其進行討論,並且討論的大部分是以示例程式碼為基礎來示範如何獲得檔案的資訊的。所有的原始碼均摘自PEFILE.DLL模組的PEFILE.C檔案。這些示例都利用了Windows NT最酷的特色之一――記憶體對映檔案,這一特色允許使用者使用一個簡單的指標來存取檔案中所包含的資料,因此所有的示例都使用了記憶體對映檔案來存取PE檔案中的資料。

注意:請查閱本文末尾關於如何使用PEFILE.DLL的那一段。

MS-DOS頭部/真實模式頭部

如上所述,PE檔案格式的第一個組成部分是MS-DOS頭部。在PE檔案格式中,它並非一個新概念,因為它與MS-DOS 2.0以來就已有的MS-DOS頭部是完全一樣的。保留這個相同結構的最主要原因是,當你嘗試在Windows 3.1以下或MS-DOS 2.0以上的系統下裝載一個檔案的時候,作業系統能夠讀取這個檔案並明白它是和當前系統不相相容的。換句話說,當你在MS-DOS 6.0下執行一個Windows NT可執行檔案時,你會得到這樣一條訊息:“This program cannot be run in DOS mode.”如果MS-DOS頭部不是作為PE檔案格式的第一部分的話,作業系統裝載檔案的時候就會失敗,並提供一些完全沒用的資訊,例如:“The name specified is not recognized as an internal or external command, operable program or batch file.”

MS-DOS頭部佔據了PE檔案的頭64個位元組,描述它內容的結構如下:

01.//WINNT.H 02. 03.typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE頭部 04.USHORT e_magic; // 魔術數字 05.USHORT e_cblp; // 檔案最後頁的位元組數 06.USHORT e_cp; // 檔案頁數 07.USHORT e_crlc; // 重定義元素個數 08.USHORT e_cparhdr; // 頭部尺寸,以段落為單位 09.USHORT e_minalloc; // 所需的最小附加段 10.USHORT e_maxalloc; // 所需的最大附加段 11.USHORT e_ss; // 初始的SS值(相對偏移量) 12.USHORT e_sp; // 初始的SP值 13.USHORT e_csum; // 校驗和 14.USHORT e_ip; // 初始的IP值 15.USHORT e_cs; // 初始的CS值(相對偏移量) 16.USHORT e_lfarlc; 

相關推薦

PE檔案格式()

Windows NT 3.1引入了一種名為PE檔案格式的新可執行檔案格式。PE檔案格式的規範包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),

PE檔案格式(六)

0x00 前言   前面兩篇講到了輸出表的內容以及涉及如何在hexWorkShop中找到輸出表及輸入DLL,感覺有幾個地方還是沒有理解好,比如由資料目錄表DataDirectory[16]找到輸出表表後以為找到輸入DLL就完了,其實這一流程的最終功能是通過輸入DLL找到輸入DLL呼叫的函

PE檔案格式(五)

0x00 前言   前一篇瞭解了區塊虛擬地址和檔案地址轉換的相關知識,這一篇該把我們所學拿出來用用了。這篇我們將瞭解更為重要的一個知識點——輸入表和輸出表的知識。 0x01 輸入表   首先我們有疑問。這個輸入表是啥?為啥有輸入表?其實輸入表就是記錄PE輸入函式相

PE檔案格式(四)

PE檔案格式詳解(四) 0x00 前言   上一篇介紹了區塊表的資訊,以及如何在hexwrokshop找到區塊表。接下來,我們繼續深入瞭解區塊,並且學會檔案偏移和虛擬地址轉換的知識。 0x01 區塊對齊值   首先我們要知道啥事區塊對齊?為啥要區塊對齊?這個問題

PE檔案格式(一)

在本文中, 我並不打算大講特講PE檔案的構成是什麼,每個欄位是什麼意思, 這些資料可以說在網上是浩瀚如海,到處都是的, 用google一搜, 開啟一看, 基本講解的都是大同小異。 由於pe檔案的結構比較龐大, 結構中套結構, 有的結構多達30多個欄位, 光看這些欄位都讓人夠

PE檔案格式(1)

PE頭由許多結構體組成,接下來分別解釋一下各部分。 1.DOS頭 微軟最初建立PE格式的時候,DOS檔案被人們廣泛的使用,為了實現PE檔案對DOS檔案的相容性。結果是在PE頭的最前面添加了一個I

PE檔案格式(2)

MS-DOS頭部/真實模式頭部   如上所述,PE檔案格式的第一個組成部分是MS-DOS頭部。在PE檔案格式中,它並非一個新概念,因為它與MS-DOS 2.0以來就已有的MS-DOS頭部是完全一樣的。保留這個相同結構的最主要原因是,當你嘗試在Windows 3.1以下或MS-

PE檔案格式(4)

1.RVA to RAW     PE檔案載入到記憶體時,每個節區都要準確完成記憶體地址與檔案偏移的對映。這種對映便稱為RVA to RAW,實現這個過程需要經過以下的步驟。     1.查詢RVA所

PE檔案格式(六)

匯出資料段,.edata   .edata段包含了應用程式或DLL的匯出資料。在這個段出現的時候,它會包含一個到達匯出資訊的匯出目錄。WINNT.Htypedef struct _IMAGE_EXPORT_DIRECTORY {  ULONG Characteristics

PE檔案格式(0)

0.介紹  PE是Windows作業系統性愛使用的可執行檔案格式。它是微軟在UNIX平臺的COFF(Common Object File Format,通用物件格式)基礎上而成的(在Windows

png檔案格式【轉】

5.2.2  PNG影象檔案儲存結構(1) PNG檔案儲存結構的格式可以在http://www.w3.org/TR/REC-png.htm上找到定義。 BMP檔案總體上由兩部分組成,分別是PNG檔案標誌和資料塊(chunks),如表5-8所示。其中資料塊分為兩類:關鍵資料塊(cri

Class 檔案格式

Class 檔案格式詳解 Write once, run everywhere!,我們都知道這是 Java 著名的宣傳口號。不同的作業系統,不同的 CPU 具有不同的指令集,如何做到平臺無關性,依靠的就是 Java 虛擬機器。計算機永遠只能識別 0 和 1組成的二進位制檔案,虛擬機器就是我們編寫的程式碼和計

PNG檔案格式

                PNG檔案結構分析(上:瞭解PNG檔案儲存格式)前言我們都知道,在進行J2ME的手機應用程式開發的時候,在圖片的使用上,我們可以使用PNG格式的圖片(甚至於在有的手機上,我們只可以使用PNG格式的圖片),儘管使用圖片可以為我們的應用程式增加不少亮點,然而,只支援PNG格式的圖片

Android逆向之旅---SO(ELF)檔案格式

第一、前言從今天開始我們正式開始Android的逆向之旅,關於逆向的相關知識,想必大家都不陌生了,逆向領域是一個充滿挑戰和神祕的領域。作為一名Android開發者,每個人都想去探索這個領域,因為一旦你破解了別人的內容,成就感肯定爆棚,不過相反的是,我們不僅要研究破解之道,也要

[一]class 檔案淺析 .class檔案格式 欄位方法屬性常量池欄位 class檔案屬性表 資料型別 資料結構

ClassFile { u4 magic;//唯一作用是確定這個檔案是否為一個能被虛擬機器所接受的class檔案。魔數值固定為0xCAFEBABE,不會改變 u2 minor_version;//唯一作用是確定這個檔案是否為一個能被虛擬機器所接受的class檔案。魔數值固定為0xCAFEBABE,不會

s19檔案格式

1.概述 為了在不同的計算機平臺之間傳輸程式程式碼和資料,摩托羅拉將程式和資料檔案以一種可列印的格式(ASCII格式)編碼成s格式檔案。s格式檔案是Freescale推薦使用的標準檔案傳送格式。編譯完成之後,FreescaleCodeWarrior編譯器將在bin資料夾下自動生成“*.abs.s19”檔案,

Linux下可執行檔案格式

Linux下面,目標檔案、共享物件檔案、可執行檔案都是使用ELF檔案格式來儲存的。程式經過編譯之後會輸出目標檔案,然後經過連結可以產生可執行檔案或者共享物件檔案。Linux下面使用的ELF檔案和Windows作業系統使用的PE檔案都是從Unix系統的COFF檔案格式演化來的

TIFF影象檔案格式(3)

基本TIFF TAGS 本頁主要摘自 http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html。每一個TAG均有原始連結,可以點選檢視詳細的描述。 這些基本Tag是所有TIFF編解碼器必須支援的Tag

SAM檔案格式

生物資訊上的東西,由於發展的時間不長,所以各種標準都不算是廣泛傳播。 尤其是檔案格式之類的,中文版的資料很少,不少英文版的說明也不是很清晰。 這裡對SAM格式進行一下解釋,希望對新人有所幫助。 如下是SAM檔案中的一行 FCC0YG3ACXX:2:1

GZIP壓縮原理分析(04)——第三章 gzip檔案格式(三02) gzip檔案頭

檔案頭由固定長度的部分和擴充套件部分組成,擴充套件部分不一定存在,尤其是網路傳輸使用的HTTP壓縮,如果使用了gzip格式,那麼對應的壓縮報文一般都不帶擴充套件部分。gzip檔案格式通過將頭部中定長部