学习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头文件。
稍后附上 实例介绍!