IMAGE_SECTION_HEADER 的源代碼如下: 每個區塊表長度占40個位元組。 * 表示需要註意的欄位,最有用的是 SizeOfRawData 、 PointerToRawData 和Characteristics 欄位。 Name * 此欄位時區塊名。(一句話:名字而已,沒什麼用) 要求: ...
IMAGE_SECTION_HEADER 的源代碼如下:
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 節表名稱,如“.text” //IMAGE_SIZEOF_SHORT_NAME=8 union {
DWORD PhysicalAddress; // 在文件中的物理地址
DWORD VirtualSize; // 真實長度,這兩個值是一個聯合結構,可以使用其中的任何一個,一般是取後一個
} Misc; DWORD VirtualAddress; // 節區的 RVA 地址
DWORD SizeOfRawData; // 在文件中對齊後的尺寸
DWORD PointerToRawData; // 在文件中的偏移量
DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移
DWORD PointerToLinenumbers; // 行號表的偏移(供調試使用地)
WORD NumberOfRelocations; // 在OBJ文件中使用,重定位項數目
WORD NumberOfLinenumbers; // 行號表中行號的數目
DWORD Characteristics; // 節屬性如可讀,可寫,可執行等 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
每個區塊表長度占40個位元組。
* 表示需要註意的欄位,最有用的是 SizeOfRawData 、 PointerToRawData 和Characteristics 欄位。
Name *
此欄位時區塊名。(一句話:名字而已,沒什麼用)
要求:
1. 占8個位元組的utf8字元串,如果區塊名超過 8 個位元組,則沒有最後的終止標誌“NULL”。
2. 每個區塊的名稱都是唯一的,不能有同名的兩個區塊。
3. 另外,如果名字過長,可以那麼使用斜杠(/)加上ASCII字元表示一個10進位地址,這個地址表示真正的區塊名在在字元串表中的地址。
含義:但事實上節的名稱不代表任何含義,僅僅是為了便查看方便(所以將包含代碼的區塊命名為“.Data” 或者說將包含數據的區塊命名為“.Code” 都是合法的。)。當我們要從PE 文件中讀取需要的區塊時候,不能以區塊的名稱作為定位的標準和依據。正確的做法是按照 IMAGE_OPTIONAL_HEADER32 結構中的數據目錄欄位結合進行定位。
其他說明:多數區塊名都習慣性以一個“.”作為開頭(例如:.text),這個“.” 不是必須的。並且前邊帶有一個“$” 的區塊名字會從連接器那裡得到特殊的待遇,前邊帶有“$” 的相同名字的區塊在載入時候將會被合併,在合併之後的區塊中,他們是按照“$” 後邊的字元的字母順序進行合併的。
Misc *
共用體:
PhysicalAddress | 在文件中的地址。 |
Virtual Size | 此節在讀取到記憶體中的總大小,單位是位元組。如果此值大於 SizeOfRawData 成員的話,此節將被0填充。此值僅當可執行鏡像且object文件必須被設置為0時有效。 |
Virtual Address *
該區塊裝載到記憶體中的RVA 地址。這個地址是按照記憶體頁來對齊的,因此它的數值總是 SectionAlignment 的值的整數倍。
在Microsoft 工具中,第一個快的預設 RVA 總為1000h。在OBJ 中,該欄位沒有意義地,並被設為0。
SizeOfRawData ***
該區塊在磁碟中所占的大小(單位是位元組),必須是IMAGE_OPTIONAL_HEADER中FileAlignment成員的整數倍。如果此值小於Virtual Size,那麼剩下的位元組以0填充。如果此節僅包含未初始化的數據,那麼成員為0。
PointerToRawData ***
該區塊在磁碟中的偏移。這個數值是從文件頭開始算起的偏移量哦。
PointerToRelocations
這哥們在EXE文件中沒有意義,在OBJ 文件中,表示本區塊重定位信息的偏移值。(在OBJ 文件中如果不是零,它會指向一個IMAGE_RELOCATION 結構的數組)
PointerToLinenumbers
行號表在文件中的偏移值,文件的調試信息,於我們沒用,雞肋。
NumberOfRelocations
這哥們在EXE文件中也沒有意義,在OBJ 文件中,是本區塊在重定位表中的重定位數目來著。
NumberOfLinenumbers
該區塊在行號表中的行號數目,雞肋。
Characteristics ***
該區塊的屬性。該欄位是按位來指出區塊的屬性(如代碼/數據/可讀/可寫等)的標誌。
在 winnt.h 中定義如下:
// // Section characteristics. // // IMAGE_SCN_TYPE_REG 0x00000000 // Reserved. // IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved. // IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved. // IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved. #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. // IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved. #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. // IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved. #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. // 0x00002000 // Reserved. // IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000 #define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section. #define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP #define IMAGE_SCN_MEM_FARDATA 0x00008000 // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000 #define IMAGE_SCN_MEM_16BIT 0x00020000 #define IMAGE_SCN_MEM_LOCKED 0x00040000 #define IMAGE_SCN_MEM_PRELOAD 0x00080000 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // #define IMAGE_SCN_ALIGN_128BYTES 0x00800000 // #define IMAGE_SCN_ALIGN_256BYTES 0x00900000 // #define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 // #define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 // #define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 // #define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 // #define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 // // Unused 0x00F00000 #define IMAGE_SCN_ALIGN_MASK 0x00F00000 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations. #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. // // TLS Characteristic Flags // #define IMAGE_SCN_SCALE_INDEX 0x00000001 // Tls index is scaled
常用的值的翻譯:
數值 |
含義 |
IMAGE_SCN_CNT_CODE |
The section contains executable code. 包含代碼,常與 0x10000000一起設置。 |
IMAGE_SCN_CNT_INITIALIZED_DATA |
The section contains initialized data. 該區塊包含以初始化的數據。 |
IMAGE_SCN_CNT_UNINITIALIZED_DATA |
The section contains uninitialized data. 該區塊包含未初始化的數據。 |
IMAGE_SCN_MEM_DISCARDABLE |
The section can be discarded as needed. |
IMAGE_SCN_MEM_SHARED |
The section can be shared in memory. |
IMAGE_SCN_MEM_EXECUTE |
The section can be executed as code. |
IMAGE_SCN_MEM_READ |
The section can be read. |
IMAGE_SCN_MEM_WRITE |
The section can be written to. |
- 更多資料請參考官方文檔:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680341(v=vs.85).aspx
例子: