【Windows】 PE文件头学习

  • Post author:
  • Post category:其他


学习PE文件头之前要先了解几个结构体:

1.

【IMAGE_DOS_HEADER】

DOS头部结构体。

2.

【IMAGE_NT_HEADERS】

PE头部结构体。

3.

【IMAGE_FILE_HEADER】

文件头部结构体。

4.

【IMAGE_OPTIONAL_HEADER】

可选头结构体。

5.

【IMAGE_SECTION_HEADER】

节表结构体。

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头文件。

稍后附上 实例介绍!



版权声明:本文为z724133545原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。