【Windows】 PE文件头学习

学习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:
  数据目录表,由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头文件。

稍后附上 实例介绍!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值