Windows Pe 第三章 PE头文件(中)
? ? 這一章的上半部分大體介紹了下PE文件頭,下半部分是詳細介紹里面的內容,這一章一定要多讀幾遍,好好記記基礎概念和知識,方便之后的學習。
簡單回憶一下:
3.4 ?PE文件頭部解析
3.4.1 DOS MZ頭 IMAGE_DOS_HEADER
?
?
?
? ? ? DOS MZ頭的下面是DOSS Stub。整個DOSS Stub是一個字節(jié)塊,其內容隨著鏈接時使用的連接器不同而不同,PE中沒有與之對應的相關結構。
3.4.2 PE頭標識Signature
? ? 緊跟在DOS Stub后面的是PE頭標識Signature。與大部分分支文件格式的頭部結構一樣,PE頭部信息中有一個四字節(jié)的標識,該標識位于指針IMAGE_DOS_HEANDER.e_lfanew指向的位置。其內容固定,對應于ASCII碼的字符串”PE\0\0”
3.4.3 ?標準PE頭IMAGE_FILE_HANDER
? ? 標準PE頭IMAGE_FILE_HEADER緊跟在PE頭標識后,即位于IMAGE_DOS_HEADER的e_lfanew值+4的位置。由此位置開始的20個字節(jié)為數據結構標準PE頭IMAGE_FILE_HEANDER的內容。該結構在微軟的官方文檔中被稱為標準通用對象文件格式(Common Object File Format,COFF)頭,它記錄了PE文件的全局屬性,該PE文件運行的平臺、PE文件類型(是EXE還是DLL文件)、文件中存在的節(jié)的總數,其詳細定義如下:
?
?
?
? ??該結構常用于判斷PE文件是EXE還是DLL類型,不但可以通過該結構得到PE文件中節(jié)的數量,還可以當成對接信息進行遍歷操作時的循環(huán)次數。
3.4.4 ?擴展PE頭IMAGE_OPTIONAL_HEADER32
? ? 盡管從名字上看好像該部分數據是可選的,但在PE文件結構中,它卻有著比標準PE頭更多的內容。詳細定義如下:
?
?
?
? ? ?文件執(zhí)行時的入口地址、文件被操作系統(tǒng)裝入內存后的默認基地址,以及節(jié)在磁盤和內存中的對齊單位等信息均可以在此結構中找到。對于該結構中的某些數值的隨意改動可能造成對PE文件的加載或運行失敗。
3.4.5 PE頭IMAGE_NT_HEADERS
? ??這個結構是廣義上的PE頭,在標準的PE文件中器大小為456個字節(jié)。它是3.4.2節(jié)、3.4.3節(jié)和3.3.4節(jié)中提到的三個數據結構的組合,即
IMAGE_NT_HEADERS=4個字節(jié)的PE標識 ?+ ??IMAGE_FILE_HEADER +IMAGE_OPTIONAL_HEADER32:
?
該結構定義如下(匯編):
IMAGE_NT_HEADERS STRUCT
??Signature DWORD ? ??;0000h ??????????????????????-PE文件標識,”PE\0\0”
??FileHeader IMAGE_FILE_HEADER <> ;0004h ????????????-PE標準頭
??OptionalHeader IMAGE_OPTIONAL_HEADER32<>;0018h ?-PE擴展頭
IMAGE_NT_HEADERS ENDS
3.4.6 ?數據目錄項IMAGE_DATA_DIRECTORY
? ? IMAGE_OPTIONAL_HEADER32(擴展PE頭)結構的最后一個字段位DataDirectory。
? ? 該字段定義了PE文件中出現的所有不同類型的目錄信息。如前所述,應用程序中的數據被按照用途分成很多種類,如導入表、導出表、資源、重定位表等。在內存中,這些數據被操作系統(tǒng)以頁位單位組織起來,并賦以不同的訪問屬性;在文件中,這些數據也同樣被組織起來,按照不同的類別分別放在文件的指定位置。該結構就是用來描述這些不同類別的數據在文件(和內存)中的位置及大小的,因為這個字段比較重要。
? ? 從Windows NT 3.1 操作系統(tǒng)開始到現在,該數據目錄中定義的數據類型一直是16種。PE中使用了一種稱作“數據目錄項IMAGE_DATA_DIRECTORY”的數據結構來定義每種數據。該結構只有兩個字段,結構具體定義如下:
IMAGE_DATA_DIRECTORY STRUCT
??VirtualAddress DWORD ? ;000h - 數據其實RVA
??isize DWORD ? ????????;004h - 數據塊的長度
IMAGE_DATA_DIRECTORY ENDS
? ? 兩個字段依次為VirtualAddress 和 isize。如圖3-11所示,總的數據目錄一共由16個相同的IMAGE_DATA_DIRECTORY結構連續(xù)排列在一起組成。
?
? ? 這16個元組的沒組每一項均代表PE中的某一個類型的數據,各數據類型詳見表3-1。?
?
?
? ? ??如果想在PE文件中尋找特定類型的數據,就需要從該結構開始。比如,要想查看PE中都調用了哪些動態(tài)間接庫的函數,則需要從數據目錄表的第2個元素的IMAGE_DATA_DIRECTORY結構獲取導入表在文件中的起始位置和大小,然后再根據VirtualAddress_1地址指向的位置找到導入表相關的字節(jié)碼。這種信息組織方式正式本章開始的“頭部+身體”的數據組織方式。
??下面是這16個數據目錄項依次展開后的新結構:
????????
? ? ? ??
3.4.7 ?節(jié)表項IMAGE_SECTION_HEADER
? ? PE頭IMAGE_NT_HEADERS后面緊跟著節(jié)表。它由許多節(jié)表項(IMAGE_SECTION_HEADER)組成,每個節(jié)表項紀錄了PE中與某個特定節(jié)有關的信息,如節(jié)的屬性、節(jié)的大小、在文件和內存中的起始位置等。節(jié)表中節(jié)的數量有字段IMAGE_FILE_HEADER.NumberOfSections來定義。
節(jié)表項的數據結構詳細定義如下:
?
? ? ?節(jié)表后面就是節(jié)的內容。截至節(jié)表,PE文件頭設計的所有數據結構已經全部介紹完畢。接下來,集中對以上所有數據結構中每個字段進行詳細介紹。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Windows Pe 第三章 PE头文件(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows核心编程 第七章 线程的调
- 下一篇: Windows Pe 第三章 PE头文件