PE文件结构学习

PE文件

Ⅰ PE文件的结构

1.概论

  • DOS系统中的COM文件:仅仅包含可执行代码,没有附加数据来指定文件入口,因此第一行执行指令必须在文件头部。没有重定位信息,因此代码中不能有跨段操作数据的指令。
  • EXE文件:在代码前加了一个文件头,包含各种说明数据,操作系统根据文件头中的信息将代码部分装入内存,根据重定位表修正代码,从文件头中指定的入口开始执行。
  • PE文件:代码、已初始化的数据、资源和重定位信息按照属性分类到不同的节中,每个节的属性和位置信息用一个IMAGE_SECTION_HEADER结构来描述,所有的ISH组成一个节表。

2.DOS文件头和DOS块

在这里插入图片描述

  • DOS_HEADER的部分比较重要的是signature为MZ表示其为PE文件在这里插入图片描述

  • 还有就是最后的e_lfanew字段,指出了真正的PE文件头在文件中的位置

在这里插入图片描述

  • DOS部分执行代码只是一个提示“this program cannot be run…”
    在这里插入图片描述

3.PE文件头

IMAGE_FILE_HEADER
  • Machine:指定文件的运行平台
  • NumberofSections:节的数量
  • TimeDateStamp:编译器创建此文件的时间
  • SizeofOptionalHeader:00e0h
  • Characteristics:属性标志字段
IMAGE_OPTIONAL_HEADER32

可以与上一个结构不加以区别

  • AddressOfEntryPoint:文件被执行时的入口地址

  • ImageBase:文件的优先装入地址,只有指定的地址被其他模块使用时才会被装入到其他地址。exe文件使用独立的虚拟地址空间,总是能够按这个地址装入。dll文件不能保证优先装入地址没有被其他的dll使用,因此必须包含重定位信息。exe默认:0040000h,dll默认:10000000h

  • SectionAlignment和FileAlignment:节被装入内存后的对齐单位和节存储在磁盘文件中的对齐单位

  • Subsystem:指定使用的界面子系统

  • DataDirectory:定义不同用途的数据块,存储着RVA和长度

在这里插入图片描述

4.节表和节

节表

也即IMAGE_SECTION_HEADER,其总数与NumberofSections相同
在这里插入图片描述

  • name:只是字符串

  • VirtualSize:节的大小,节的数据在没有进行对齐处理前的实际大小

  • VirtualAddress:节被装载到内存中后的偏移地址,是一个RVA,按照内存页对齐

  • PointerToRawData:节在磁盘文件中所处的位置,文件头开始算起的偏移量

  • SizeOfRawData:节在磁盘文件中所占的空间大小,等于VirtualSize按FileAlignment对齐后的大小

    依靠上面四个字段的值,装载器就可以从PE文件中找出某个节的数据并将其映射到内存中(映射到模块基地址开始偏移VirtualSize的地方,并占用以VirtualSize的值按照页的尺寸对齐后的空间大小)

  • Characteristics:属性标志字段

欢迎指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值