结构
IMAGE_DOS_HEADER(MS-DOS头)
IMAGE_NT_HEADER(PE文件头)
Signature:PE
IMAGE_FILE_HEADER
IMAGE_OPTIONAL_HEADER32
IMAGE_SECTION_HEADER(区段表)
SECTIONS(区段)
各部分常用关键字段
MAGE_DOS_HEADER(DOS头)
0x3C e_lfanew PE 文件头偏移
IMAGE_FILE_HEADER
0x06 NumberOfSections 区段数量
0x14 SizeOfOptionalHeader 扩展头大小
0x16 Characteristics PE文件属性
IMAGE_SECTION_HEADER
0x28 AddressOfEntryPoint 程序执行入口RVA
0x2C BaseOfCode 代码段起始RVA
0x30 BaseOfData 数据段起始RVA
0x34 ImageBase 程序默认载入基址(0x400000)
0x38 SectionAlignment 内存中的段对齐值
0x3C FileAlignment 文件中的段对齐值
0x50 SizeOfImage 内存中PE文件映像总尺寸
0x58 SizeOfHeaders 各个文件头的总尺寸
0x74 NumberOfRvaAndSizes 数据目录表数量(0x10=16)
0x78 IMAGE_DATA_DIRECTORY DataDirectory[0x10]
数据目录表
IMAGE_SECTION_HEADER
0x00 BYTE Name[0x8] 区段名
0x08 VirtualSize 该区段在内存中的大小
VirtualAddress 区段在内存中的RVA
SizeOfRawData 区段在文件(磁盘)中的大小
PointerToRawData 区段在文件中的偏移
Characteristics 区段属性
PE文件加载
PE文件磁盘中和在内存中是不一样的,关系如图
由于不论在内存中还是在磁盘中内存中块表后面为了按照段对齐而填充了0,在添加区段的时候可以直接在该处添加区段头,不会影响后面部分的RVA或者文件偏移.