PE文件詳解三:節表(區塊表)IMAGE_SECTION_HEADER結


節表(區塊表):
PE文件中所有節的屬性都被定義在節表中,節表由一系列的IMAGE_SECTION_HEADER結構排列而成,每個結構用來 描述一個節,結構的排列順序和它們描述的節在文件中的排列順序是一致的。全部有效結構的最后以一個空的IMAGE_SECTION_HEADER結構作為 結束,所以節表中總的IMAGE_SECTION_HEADER結構數量等於節的數量加一。節表總是被存放在緊接在PE文件頭的地方。
另外,節表中 IMAGE_SECTION_HEADER 結構的總數總是由PE文件頭 IMAGE_NT_HEADERS 結構中的 FileHeader.NumberOfSections 字段來指定的。

此結構體共占40個字節

typedef struct _IMAGE_SECTION_HEADER 

{
+0h BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 節表名稱,如“.text” 
//IMAGE_SIZEOF_SHORT_NAME=8
union
+8h {
DWORD PhysicalAddress; // 物理地址
DWORD VirtualSize; // 真實長度,這兩個值是一個聯合結構,可以使用其中的任何一個,一
// 般是取后一個
} Misc;
+ch DWORD VirtualAddress; // 節區的 RVA 地址
+10h DWORD SizeOfRawData; // 在文件中對齊后的尺寸
+14h DWORD PointerToRawData; // 在文件中的偏移量
+18h DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移
+1ch DWORD PointerToLinenumbers; // 行號表的偏移(供調試使用地)
+1eh WORD NumberOfRelocations; // 在OBJ文件中使用,重定位項數目
+20h WORD NumberOfLinenumbers; // 行號表中行號的數目
+24h DWORD Characteristics; // 節屬性如可讀,可寫,可執行等
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

Name: 區塊名。這是一個由8位的ASCII 碼名,用來定義區塊的名稱。多數區塊名都習慣性以一個“.”作為開頭(例如:.text),這個“.” 實際上是不是必須的。值得我們注意的是,如果區塊名超過 8 個字節,則沒有最后的終止標志“NULL” 字節。並且前邊帶有一個“$” 的區塊名字會從連接器那里得到特殊的待遇,前邊帶有“$” 的相同名字的區塊在載入時候將會被合並,在合並之后的區塊中,他們是按照“$” 后邊的字符的字母順序進行合並的。
另外每個區塊的名稱都是唯一的,不能有同名的兩個區塊。但事實上節的名稱不代表任何含義,他的存在僅僅是為了正 規統一編程的時候方便程序員查看方便而設置的一個標記而已。所以將包含代碼的區塊命名為“.Data” 或者說將包含數據的區塊命名為“.Code” 都是合法的。當我們要從PE 文件中讀取需要的區塊時候,不能以區塊的名稱作為定位的標准和依據,正確的方法是按照 IMAGE_OPTIONAL_HEADER32 結構中的數據目錄字段結合進行定位。

Virtual Size:該區塊表對應的區塊的大小,這是區塊的數據在沒有進行對齊處理前的實際大小。

Virtual Address:該區塊裝載到內存中的RVA 地址。這個地址是按照內存頁來對齊的,因此它的數值總是 SectionAlignment 的值的整數倍。在Microsoft 工具中,第一個快的默認 RVA 總為1000h。在OBJ 中,該字段沒有意義地,並被設為0。

SizeOfRawData:該區塊在磁盤中所占的大小。在可執行文件中,該字段是已經被FileAlignment 潛規則處理過的長度。

PointerToRawData:該區塊在磁盤中的偏移。這個數值是從文件頭開始算起的偏移量哦。

PointerToRelocations:這哥們在EXE文件中沒有意義,在OBJ 文件中,表示本區塊重定位信息的偏移值。(在OBJ 文件中如果不是零,它會指向一個IMAGE_RELOCATION 結構的數組)

PointerToLinenumbers:行號表在文件中的偏移值,文件的調試信息,於我們沒用,雞肋。

NumberOfRelocations:這哥們在EXE文件中也沒有意義,在OBJ 文件中,是本區塊在重定位表中的重定位數目來着。

NumberOfLinenumbers:該區塊在行號表中的行號數目,雞肋。

Characteristics:該區塊的屬性。該字段是按位來指出區塊的屬性(如代碼/數據/可讀/可寫等)的標志。

IMAGE_SCN_CNT_CODE
0x00000020

 

The section contains executable code.

包含代碼,常與 0x10000000一起設置。

 

IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040

 

The section contains initialized data.

該區塊包含以初始化的數據。

 

IMAGE_SCN_CNT_UNINITIALIZED_DATA
0x00000080

 

The section contains uninitialized data.

該區塊包含未初始化的數據。

 

IMAGE_SCN_MEM_DISCARDABLE
0x02000000

The section can be discarded as needed.
該區塊可被丟棄,因為當它一旦被裝入后,
進程就不在需要它了,典型的如重定位區塊。

IMAGE_SCN_MEM_SHARED
0x10000000
The section can be shared in memory.
該區塊為共享區塊。

IMAGE_SCN_MEM_EXECUTE
0x20000000

The section can be executed as code.
該區塊可以執行。通常當0x00000020被設置
時候,該標志也被設置。

IMAGE_SCN_MEM_READ
0x40000000

The section can be read.
該區塊可讀,可執行文件中的區塊總是設置該
標志。

IMAGE_SCN_MEM_WRITE
0x80000000
The section can be written to.
該區塊可寫。


以下給大家列舉出最常用的一些屬性值:
具體內容可以參考MSDN在線文檔:http://msdn.microsoft.com/en-us/library/ms680341(v=vs.85).aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM