PE文件學習系列三-PE頭詳解

合肥程序員羣:49313181。    合肥實名程序員羣:128131462 (不肯透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

最近比較忙,只能抽節假日去學習和記錄本身的學習,這一節我記錄本身學習PE頭的學習。在這裏給你們介紹一本很好的學習PE的書:Windows PE權威指南。上一節咱們一塊兒學習DOS頭。DOS頭不少內容在16位DOS系統下面纔會用到。在如今的Win32系統中,這些事冗餘。程序員

所以咱們關注更多的是PE頭而非DOS頭。首先上圖,對着圖片看纔夠清晰:數組

PE結構

之後無論咱們學習PE的哪一個結構,咱們都對着這個圖去學習,這樣纔會有感受。學習

上PE頭C結構描述,這個結構仍是在WinNT.h中:加密

typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

請查看上面的圖片四字節的被稱爲PE標識符的Signature這四個字節就是圖上面的PE00。我猜PE文件的稱謂也是這個原因吧。鬨堂大笑。_IMAGE_NT_HEADERS 結構的另外兩個成員都是結構體,spa

1.PE標準機構-IMAGE_FILE_HEADER

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;//運行平臺
    WORD    NumberOfSections;//PE文件中節的數量
    DWORD   TimeDateStamp;//文件建立時間和日期
    DWORD   PointerToSymbolTable;//指向符合表(用於調試)
    DWORD   NumberOfSymbols;//符合表中符號數量(用於調試)
    WORD    SizeOfOptionalHeader;//擴展頭結構的長度
    WORD    Characteristics;//文件屬性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

 

我已經給機構成員後面添加了備註,讓咱們理解這個結構。IMAGE_FILE_HEADER.NumberOfSections。PE節的數量,這個能夠對節區信息進行遍歷的循環次數。操作系統

2.PE擴展頭-IMAGE_OPTIONAL_HEADER32

typedef struct _IMAGE_OPTIONAL_HEADER {
    //
    // Standard fields.
    //

    WORD    Magic;//魔術字
    BYTE    MajorLinkerVersion;//鏈接器版本號
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;  //全部含代碼節的總大小
    DWORD   SizeOfInitializedData;//全部含已初始化數據的節的總大小
    DWORD   SizeOfUninitializedData;//全部含未初始化數據的節的大小
    DWORD   AddressOfEntryPoint;//程序執行入口RVA
    DWORD   BaseOfCode;//代碼節的起始RVA
    DWORD   BaseOfData;//數據節的起始RVA

    //
    // NT additional fields.
    //

    DWORD   ImageBase; //程序的建議裝載地址
    DWORD   SectionAlignment;//內存節的對齊粒度
    DWORD   FileAlignment;//文件中節的對齊粒度
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;//操做系統版本號
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;//內存中PE鏡像文件尺寸
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;//DLL文件特性
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;//下面的數據目錄結構的項目數量
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//數據目錄
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

以上我對一些比較關注的機構字段加上了備註。調試

查看以上機構咱們看到這個IMAGE_OPTIONAL_HEADER32結構內容特別豐富,比PE標準結構豐富多了。code

SectionAlignment這個字段是內存中節的對齊粒度,在這裏我要說明下,Windows系統中(默認32位系統),操做系統能識別4G內存,對於每一個進程都有一個獨立的4G虛擬內存。在這種4G虛擬內存機制中起到最大的做用是內存分頁機制,內存分頁機制將一部分硬盤空間做爲內存。而這個分頁機制中的頁大小爲4K,也就是16進制的1000H。那麼咱們很容易知道默認的SectionAlignment值就是1000H,也就是4K。固然PE文件在硬盤上是不同的,PE文件存磁盤上對齊粒度是200H。blog

結構最後一個字段IMAGE_DATA_DIRECTORY。該字段定義了PE文件中出現的全部不一樣類型的數據的目錄信息,應用程序中數據被按照用途分紅不少種類,如導入表,導出表,資源,重定位表等,DataDirectory數組個數爲16。進程

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;//數據起始RVA
    DWORD   Size;//數據塊長度
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

IMAGE_DATA_DIRECTORY.VirtualAddress虛擬地址指定的是相應節的相對虛擬地址(RVA),PE文件中有16個節,嚴格講有15個,最後一個是預留的。

學到這有人會問,看了這麼多結構,有什麼用呢??這個真的頗有用,後期能夠寫程序區分析這些機構。能夠動態改變PE結構,能夠給PE文件加密……,等等都是靠對這些機構的理解才能作到。

 

-----

版權:歸博客園和Egojit全部,轉載請標明出處。
相關文章
相關標籤/搜索