PE文件的装载过程(3)

紧接着IMAGE_FILE_HEADER结构的是IMAGE_OPTIONAL_HEADER32结构,这个结构称为可选头, 其中定义了很多重要的信息,可选头的结构如下所示:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
IMAGE_OPTIONAL_HEADER32 STRUCT

  Magic WORD 
? ; 107h=ROM Image,10Bh=exe Image
  MajorLinkerVersion BYTE 
? ;  链接器版本号
  MinorLinkerVersion BYTE  
? ; 
  SizeOfCode DWORD 
? ;  所有含代码的节的总大小
  SizeOfInitializedData DWORD
? ; 所有含已初始化数据的节的总大小
  SizeOfUninitializedData DWORD 
? ; 所有含未初始化数据的节的大小
  AddressOfEntryPoint DWORD 
? ;程序执行入口RVA
  BaseOfCode DWORD 
? ;代码的节的起始RVA
  BaseOfData DWORD 
? ;数据的节的起始RVA
  ImageBase  DWORD 
? ;程序的建议装载地址
  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  
? ;文件的子系统
  DllCharacteristics WORD  
? ;
  SizeOfStackReserve DWORD 
? ;初始化时的堆栈大小
  SizeOfStackCommit DWORD 
? ;初始化时实际提交的堆栈大小
  SizeOfHeapReserve DWORD 
? ;初始化时保留的堆大小
  SizeOfHeapCommit DWORD 
? ;初始化时实际提交的堆大小
  LoaderFlags  DWORD 
? ;未用
  NumberOfRvaAndSizes DWORD 
? ;下面的数据目录结构的数量
  DataDirectory IMAGE_DATA_DIRECTORY 
16 dup(<>) ;
IMAGE_OPTIONAL_HEADER32 ENDS


这个结构中重要的元素有如下几个:

AddressOfEntryPoint:指出了可执行代码入口点在内存中的偏移(RVA),这个偏移是相对文件本装入内存以后此入口点相对文件头的偏移,由于PE文件在磁盘中和在内存中的对齐粒度不一样,一般情况下文件在内存中的对齐力度是1000h,而在磁盘中的对齐粒度是200h,也就是说文件在内存中占用的空间一般会大于在文件中占用的空间,所以导致可执行代码入口点的偏移在内存中和在磁盘中不同。

ImageBase:文件优先装入地址,对exe文件来说为400000h,对dll一般为10000000h,且一般情况下对exe文件不需要重定位文件在内存中位置,即文件优先装入地址为ImageBase地址,而dll很难满足。

SectionAlignment:文件在内存中的对齐粒度,即每个节在内存中的装入地址必须是本值的整数倍,值一般为1000h

FileAlignment:文件在磁盘中的对齐粒度,意义同SectionAlignment,值一般为200h

Subsystem:对windows下应用程序来说,如果程序是图形界面,其值为2,如果是控制台程序,值为3

DataDirectory:由16个IMAGE_DATA_DIRECTORY结构组成,用来定义不同用途的数据块在内存中的偏移和大小

转载于:https://www.cnblogs.com/feiyucq/archive/2009/05/31/1492904.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值