1. 程式人生 > >【Windows】 PE檔案頭學習

【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:
  資料目錄表,由NumberOfRvaAndSizesIMAGE_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標頭檔案。

稍後附上 例項介紹!