PE文件的装载过程(1)

Windows下的可执行文件为PE(Portable Executable File Format/可移植的执行体)格式,文件的组织形式还是比较复杂的,花了大概一个星期的时间终于稍微弄懂了PE文件的装载过程。

PE文件最开始的部分称为DOS头,存在的作用是为了兼容DOS下的可执行程序,DOS头的结构如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
IMAGE_DOS_HEADER STRUCT

  e_magic             WORD      
?      ;DOS可执行文件标记,为“MZ”

  e_cblp              WORD      
?

  e_cp                WORD      
?

  e_crlc              WORD      
?

  e_cparhdr           WORD      
?

  e_minalloc          WORD      
?

  e_maxalloc          WORD      
?

  e_ss                WORD      
?      ;DOS代码的初始化堆栈段

  e_sp                WORD      
?      ;DOS代码的初始化堆栈指针

  e_csum              WORD      
?

  e_ip                WORD      
?      ;DOS代码的入口IP

  e_cs                WORD      
?      ;DOS代码的入口CS

  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文件头

IMAGE_DOS_HEADER ENDS

可以看到,这个结构总共占用的空间为32个WORD,64个字节,64×8个bit,也就是说每个PE文件的DOS头都同样地占用64个字节的空间,这个结构中比较重要的元素有两个,一是开始部分的e_magic,为DOS可执行文件的标志,翻译成ASCII即为字符“MZ”,另外一个是结构的最后一个元素e_lfanew,为一个双字,为PE文件头相对于本文件开始处的偏移量,也可以认为是PE文件头在本文件中的开始地址,如e_lfanew的值为2801h,而这个值在PE文件中的保存地址为3ch和3dh,但是e_lfanew的真实值并不是2801h,而是0128h,因为在x86体系中高地址存放高位的数据,低地址存放低位数据,所以e_lfanew的真实值应该颠倒一下。

操作系统装载PE文件的时候首先检查“MZ”标志,然后读取e_lfanew的值,如上例所示,为128h,然后装载程序会到PE文件的128h处读取数据,如果是PE文件的话,128h和129h处的内容一定为50h和45h,翻译成ASCII即为字符“PE”,此处即为PE文件头的开始。

 

转载于:https://www.cnblogs.com/feiyucq/archive/2009/05/27/1491004.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值