DOS头(DOS MZ header):它是一个IMAGE_DOS_HEADER结构,定义如下:
IMAGE_DOS_HEADER STRUCT ;64个字节
e_magic WORD ? ;DOS头标记,其值固定为5A4Dh
e_cblp WORD ?
e_cp WORD ?
e_crlc WORD ?
e_cparhdr WORD ?
e_minalloc WORD ?
e_maxalloc WORD ?
e_ss WORD ?
e_sp WORD ?
e_csum WORD ?
e_ip WORD ?
e_cs WORD ?
e_lfarlc WORD ?
e_ovno WORD ?
e_res WORD 4 dup(?)
e_oemid WORD ?
e_oeminfo WORD ?
e_res2 WORD 10 dup(?)
e_lfanew DWORD ? ;指向 PE header 的文件偏移量
IMAGE_DOS_HEADER ENDS
|
DOS代码(DOS stub)
|
|
|
|
PE头(PE header):它是一个IMAGE_NT_HEADERS 结构,定义如下:
IMAGE_NT_HEADERS STRUCT
Signature DWORD ? ;PE头标记
FileHeader IMAGE_FILE_HEADER <> ;文件头/20个字节
OptionalHeader IMAGE_OPTIONAL_HEADER32 <> ;任选头
IMAGE_NT_HEADERS ENDS
|
文件头(FileHeader):它是一个IMAGE_FILE_HEADER结构,定义如下:
IMAGE_FILE_HEADER STRUCT ;20个字节
Machine WORD ?
NumberOfSections WORD ? ;文件的节数目
TimeDateStamp DWORD ? ;文件创建日期和时间
PointerToSymbolTable DWORD ?
NumberOfSymbols DWORD ?
SizeOfOptionalHeader WORD ? ; 指示紧随本结构之后的OptionalHeader 结构大小
Characteristics WORD ?; 关于文件信息的标记,比如文件是exe还是dll
IMAGE_FILE_HEADER ENDS
|
任选头(OptionalHeader):它是一个IMAGE_OPTIONAL_HEADER32结构,定义如下:
IMAGE_OPTIONAL_HEADER32 STRUCT
Magic WORD ?
MajorLinkerVersion BYTE ?
MinorLinkerVersion BYTE ?
SizeOfCode DWORD ?
SizeOfInitializedData DWORD ?
SizeOfUninitializedData DWORD ?
AddressOfEntryPoint DWORD ?; PE装载器准备运行的第一个指令的RVA
BaseOfCode DWORD ?
BaseOfData DWORD ?
ImageBase DWORD ?; PE文件的优先装载地址(映像基址)
SectionAlignment DWORD ?; 内存中节对齐的粒度
FileAlignment DWORD ?; 文件中节对齐的粒度
MajorOperatingSystemVersion WORD ?
MinorOperatingSystemVersion WORD ?
MajorImageVersion WORD ?
MinorImageVersion WORD ?
MajorSubsystemVersion WORD ?
MinorSubsystemVersion WORD ?
Win32VersionValue DWORD ?
SizeOfImage DWORD ?; 内存中整个PE映像体的尺寸
SizeOfHeaders DWORD ?; 所有头+节表的大小
CheckSum DWORD ?
Subsystem WORD ?; NT用来识别PE文件属于哪个子系统
DllCharacteristics WORD ?
SizeOfStackReserve DWORD ?
SizeOfStackCommit DWORD ?
SizeOfHeapReserve DWORD ?
SizeOfHeapCommit DWORD ?
LoaderFlags DWORD ?
NumberOfRvaAndSizes DWORD ?
DataDirectory IMAGE_DATA_DIRECTORY 16 dup(<>);数据目录
IMAGE_OPTIONAL_HEADER32 ENDS
|
数据目录(DataDirectory):它是一个IMAGE_DATA_DIRECTORY结构,定义如下:
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress DWORD ?;指向 IMAGE_IMPORT_DESCRIPTOR 数组的RVA
isize DWORD ?
IMAGE_DATA_DIRECTORY ENDS
|
节表(Section table):它是一个IMAGE_SECTION_HEADER结构,定义如下
IMAGE_SECTION_HEADER STRUCT ;40个字节
Name1 db 8 dup(?) ;节名
union Misc
PhysicalAddress dd ?
VirtualSize dd ?
ends
VirtualAddress dd ?; 本节的RVA(相对虚拟地址)
SizeOfRawData dd ?; 经过文件对齐处理后节尺寸
PointerToRawData dd ?; 这是节基于文件的偏移量
PointerToRelocations dd ?
PointerToLinenumbers dd ?
NumberOfRelocations dw ?
NumberOfLinenumbers dw ?
Characteristics dd ?; 包含标记以指示节属性
IMAGE_SECTION_HEADER ENDS: