【Windows】 PE檔案頭學習
學習PE檔案頭之前要先了解幾個結構體:
IMAGE_DOS_HEADER DOS頭部結構體:
對於一個PE檔案來說,最開始的位置就是一個DOS程式。DOS程式包含了一個DOS頭部和一個DOS程式體。DOS頭部是用來裝載DOS程式的 保留著部分是為了與DOS系統相相容。當Win32程式在DOS下被執行時 DOS存根程式會輸出“this program cannot be run in DOS mode”字樣對使用者進行提示。
雖然DOS頭部是為了裝載DOS程式的,但是DOS頭部中的一個欄位儲存著指向PE頭部的位置。DOS檔案在Winnt.h標頭檔案中被定義為IMAGE_DOS_HEADERDOS。
IMAGE_DOS_HEADER
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
這個結構體中需要了解的欄位有兩個 分別是第一個欄位 e_magic 和最後一個欄位e_lfanew。
e_maigc :
這個欄位是一個DOS可執行檔案的識別符號,佔用2位元組。這個位置儲存著字元是”MZ”,該識別符號在Winnt.h標頭檔案中有一個巨集定義如下:
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
e_lfanew :
這個欄位儲存著PE頭[IMAGE_NT_HEADERS]的起始位置偏移
IMAGE_NT_HEADERS PE頭部結構體:
DOS頭是為了相容DOS系統而遺留的,DOS頭中最後一個位元組給出了PE頭的位置。PE頭部是真正用來裝載Win32程式的頭部,PE頭部的定義為IMAGE_NT_HEADERS,該結構體包含PE識別符號、檔案頭IMAGE_FILE_HEADER和可選頭IMAGE_OPTIONAL_HEADER三個部分。
IMAGE_NT_HEADERS是一個巨集,其定義如下:
#ifdef _WIN64
typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
#else
typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
#endif
該標頭檔案分為32位和64位兩個版本,其定義依賴於是否定義了_WIN64
IMAGE_NT_HEADERS64定義如下:
typedef struct _IMAGE_NT_HEADERS64 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
IMAGE_NT_HEADERS32定義如下:
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
該結構體中的Signature就是PE識別符號,標識該檔案是否是PE檔案。該部分佔用4位元組,
即”50 45 00 00”。該識別符號在Winnt.h中也有巨集定義,如下:
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
FileHeader:
IMAGE_FILE_HEADER 的物件。
OptionalHeader:
IMAGE_OPTIONAL_HEADER32 的物件
可以通過判斷Signature來確定是否PE檔案,首先判斷DOS頭部開始位元組是否是“MZ”,通過DOS頭部找到PE頭部,接著判斷PE頭部前四個位元組是否為“PE\0\0”。如果是的話就說明該檔案是一個有效的PE檔案。
在PE頭中除了Signature以外,還有兩個重要的結構體,分別是IMAGE_FILE_HEADER(檔案頭部)和IMAGE_OPTIONAL_HEADER(可選頭部)。這兩個頭在PE頭部中佔據重要位置,因此需要詳細瞭解這兩個結構體!
IMAGE_FILE_HEADER 檔案頭部結構體:
檔案頭部結構體是IMAGE_NT_HEADERS結構體中的一個結構體,緊接在PE識別符號的後面。IMAGE_NT_HEADERS結構體的大小為20位元組,它的起始位置取決於PE頭部的起始位置,PE頭部的起始位置取決於IMAGE_DOS_HEADER中的e_lfanew的位置。除了IMAGE_DOS_HEADER的起始位置外,其他的頭部位置都依賴於PE頭部的起始位置。
IMAGE_FILE_HEADER 定義如下:
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //表示可執行檔案的CPU型別
WORD NumberOfSections; //表示PE檔案的節區個數
DWORD TimeDateStamp; //表示檔案何時被建立
DWORD PointerToSymbolTable; //很少使用
DWORD NumberOfSymbols; //很少使用
WORD SizeOfOptionalHeader; //表示IMAGE_OPTIONAL_HEADER大小
WORD Characteristics; //表示檔案型別
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Machine:
該欄位是WORD型別,佔用2位元組。表示可執行檔案的目標CPU型別。取值如下:
#define IMAGE_FILE_MACHINE_UNKNOWN 0
#define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
#define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
#define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5 0x01a8 // SH5
#define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB 0x01c2 // ARM Thumb/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT 0x01c4 // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33 0x01d3
#define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
#define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
#define IMAGE_FILE_MACHINE_CEF 0x0CEF
#define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE 0xC0EE
NumberOfSections:
該欄位WORD型別,佔用2位元組。表示PE檔案的節區的個數
TimeDataStamp:
該欄位表明了檔案是合適被建立的,這個值是從1970年1月1日以來用格林威治時間計算的秒數。
PointerToSymbolTable:
符號表,指向COFF符號表(主要用於除錯) 。
NumberOfSymbols:
符號表中的符號數。
SizeOfOptionalHeader:
該欄位為WORD型別,佔用2位元組。該欄位指定了IMAGE_OPTIONAL_HEADER結構的大小。
這裡注意下 在計算IMAGE_OPTIONAL_HEADER的大小是應該從IMAGE_FILE_HEADER的這個欄位來獲取,而不應該直接使用sizeof(IMAGE_OPTIONAL_HEADER)計算。IMAGE_OPTIONAL_HEADER結構體的大小是可能會改變的。
Characteristics:
該欄位為WORD型別,佔用2位元組。它指定了檔案的型別,例如DLL檔案,系統檔案.其取值定義如下:
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved external references).
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 // Aggressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // If Image is on removable media, copy and run from the swap file.
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // If Image is on Net, copy and run from the swap file.
#define IMAGE_FILE_SYSTEM 0x1000 // System File.
#define IMAGE_FILE_DLL 0x2000 // File is a DLL.
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // File should only be run on a UP machine
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.
IMAGE_OPTIONAL_HEADER可選頭結構體:
可選頭是對檔案頭的一個補充。檔案頭主要描述檔案的相關資訊,而可選頭主要用來管理PE檔案被作業系統裝載時所需要的資訊。該頭也擁有32位版本和64位版本之分。
IMAGE_OPTIONAL_HEADER是一個巨集,定義如下:
#ifdef _WIN64
typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
#else
typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
#endif
IMAGE_OPTIONAL_HEADER64定義如下:
typedef struct _IMAGE_OPTIONAL_HEADER64 {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
ULONGLONG ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
ULONGLONG SizeOfStackReserve;
ULONGLONG SizeOfStackCommit;
ULONGLONG SizeOfHeapReserve;
ULONGLONG SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
IMAGE_OPTIONAL_HEADER32定義如下:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// 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;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
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;
這裡主要介紹32位為主。
Magic:
該欄位指定了檔案的狀態型別,狀態型別取值如下:
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b //可執行檔案32位
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b //可執行檔案64位
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 //ROM檔案
MajorLinkerVersion:
主連結版本號。
MinorLinkerVersion:
次連結版本號。
SizeOfCode:
程式碼節的大小。如果有多個程式碼節的話,該值是所有程式碼節大小的總和(通常只有一個程式碼節),該處是指所有包含可執行屬性的節大小。
SizeOfInitializedData:
已初始化資料塊大小。
SizeOfUnInitializedData:
未初始化資料塊大小。
AddressOfEntryPoint:
程式執行的入口地址。該地址是一個相對的虛擬地址,簡稱EP(EntryPoint),這個值指向了程式第一條要執行的程式碼。程式如果被加殼後會修改該欄位的值。該欄位的地址指向不是main()函式的地址,也不是WinMain()函式的地址,而是執行庫的啟動程式碼的地址。對於DLL來說這個值意義不大,因為DLL甚至可以沒有DLLMain()函式。
BaseOfCode:
程式碼段的起始相對虛擬地址
BaseOfData:
資料段的起始相對虛擬地址
ImageBase:
檔案被裝入記憶體後的首選建議裝載地址。對於EXE檔案來說,通常情況下該地址就是裝載地址。對於DLL檔案來說,可能就不是其裝入記憶體後的地址了。
SectionAlignment:
節表被裝入記憶體後的對齊值。節表被對映到記憶體中需要對齊的單位。在Win32下,通常情況下,該值為0X1000,也就是4KB大小。Windows作業系統的記憶體分頁一般為4KB。
FileAlignment:
節表在檔案中的對齊值。通常情況下該值為0x1000或0x200。在檔案對齊值為0x1000時,由於與記憶體對齊值相同,可以加快裝載速度。而檔案對齊值為0x200時,可以佔用相對較少的磁碟空間。0x200是512位元組通常磁碟的一個扇區為512位元組。
MajorOperatingSystemVersion:
要求最低作業系統的主版本號。
MinorOperatingSystemVersion:
要求最低作業系統的次版本號。
MajorImageVersion:
可執行檔案的主機板吧號。
MinorImageVersion:
可執行檔案的次版本號。
Win32VersionValue:
該成員是被保留的。
SizeOfImage:
可執行檔案裝入記憶體後的總大小。該大小按記憶體對齊方式對齊。
SizeOfHeaders:
整個PE頭部的大小。這個PE頭部泛指DOS頭、PE頭、節表的總和大小。
CheckSum:
校驗和值。對於EXE檔案通常為0;對於SYS檔案,則必須有一個校驗和。
SubSystem:
可執行檔案的子系統型別。取值如下:
#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem.
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem.
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 //
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 //
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 //
#define IMAGE_SUBSYSTEM_EFI_ROM 13
#define IMAGE_SUBSYSTEM_XBOX 14
#define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16
DllCharacteristics:
指定DLL檔案的屬性,該值大部分時候為0。
SizeOfStackReserve:
為執行緒保留的棧大小。
SizeOfStackCommit:
為執行緒已提交的棧大小。
SizeOfHeapReserve:
為執行緒保留的堆大小。
SizeOfHeapCommit:
為執行緒已提交的堆大小。
LoaderFlags:
被廢棄的成員值,這個值在某些情況下還是會被用到的,比如針對原始的低版本OD來說,修改該值可以起到反除錯的作用。
NumberOfRvaAndSizes:
資料目錄項個數。該個數在Winnt.h中有一個巨集定義,如下:
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
DataDirectory:
資料目錄表,由NumberOfRvaAndSizes個IMAGE_DATA_DIRECTORY結構體組成。該陣列包含輸入表、輸出表、資源、重定位等資料目錄項的RVA(相對虛擬地址)和大小。
IMAGE_DATA_DIRECTORY結構體的定義如下:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
該結構體的第一個變數為該目錄項的相對虛擬地址的起始值,第二個是該目錄項的長度。資料目錄中的成員在陣列中的索引如下:
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
// IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
IMAGE_SECTION_HEADER節表頭結構體:
節表的位置在IMAGE_OPTIONAL_HEADER的後面,節表中的每個IMAGE_SECTION_HEADER中都存放著可執行檔案被對映到記憶體中所在位置的資訊,節表的個數IMAGE_FILE_HEADER中的NumberOfSections給出。
IMAGE_SECTION_HEADER的大小為40位元組,其結構體定義如下:
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
Name:
該成員變數儲存著結表項的名稱,節的名稱用ASCII編碼儲存。節名稱的長度為IMAGE_SIZEOF_SHORT_NAME,這是一個巨集,在Winnt.h中定義如下:
#define IMAGE_SIZEOF_SHORT_NAME 8
節名長度為8位元組,多餘的位元組會被截斷。通常情況下,節名“.”為開始。非強制性約定。
PhysicalAddress:
實體地址(磁碟地址)。
VirtualSize:
該值為資料實際的節表項大小,不一定是對齊後的值。
VirutalAddress:
該值為節表項載入記憶體後的相對虛擬地址。這個地址是按記憶體進行對齊的。
SizeOfRawData:
該節表項在磁碟上的大小,該值通常是對齊後的值,也有例外。
PointerToRwaData:
該節表項在磁碟檔案上的偏移地址。
PointerToRelocations:
該項指向重定位項的開始檔案指標。不常用
PointerToLinenumbers:
該項指向行號表的開頭的檔案指標。不常用
NumberOfRelocations:
該項指出重定位項的數目。不常用
NumberOfLinenumbers:
行號表中行號的數目。不常用
Characteristics:
節表項的屬性,該屬性取值如下:
#define IMAGE_SCN_CNT_CODE 0x00000020 // 該節區包含程式碼
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // 該節區包含初始化資料
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // 該節區包含未初始化資料
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // 該節區可以丟棄的
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // 該節區不快取
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // 該節區不分頁
#define IMAGE_SCN_MEM_SHARED 0x10000000 // 該節區為可共享
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // 該節區為可執行
#define IMAGE_SCN_MEM_READ 0x40000000 // 該節區為可讀
#define IMAGE_SCN_MEM_WRITE 0x80000000 // 該節區為可寫
屬性有很多 對其他屬性該興趣的朋友可以查閱 Winnt.h標頭檔案。
稍後附上 例項介紹!