最近比較忙,只能抽節假日去學習和記錄本身的學習,這一節我記錄本身學習PE頭的學習。在這裏給你們介紹一本很好的學習PE的書:Windows PE權威指南。上一節咱們一塊兒學習DOS頭。DOS頭不少內容在16位DOS系統下面纔會用到。在如今的Win32系統中,這些事冗餘。程序員
所以咱們關注更多的是PE頭而非DOS頭。首先上圖,對着圖片看纔夠清晰:數組
之後無論咱們學習PE的哪一個結構,咱們都對着這個圖去學習,這樣纔會有感受。學習
上PE頭C結構描述,這個結構仍是在WinNT.h中:加密
請查看上面的圖片四字節的被稱爲PE標識符的Signature這四個字節就是圖上面的PE00。我猜PE文件的稱謂也是這個原因吧。。_IMAGE_NT_HEADERS 結構的另外兩個成員都是結構體,spa
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節的數量,這個能夠對節區信息進行遍歷的循環次數。操作系統
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文件加密……,等等都是靠對這些機構的理解才能作到。
-----