吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 1533|回复: 17
上一主题 下一主题

[调试逆向] 1-PE文件格式详细解析(一)

[复制链接]
跳转到指定楼层
楼主
yaoyao7 发表于 2020-3-8 11:42 回帖奖励

PE文件格式详细解析(一)

一、PE文件基本介绍

PE文件是Windows操作系统下使用的一种可执行文件,由COFF(UNIX平台下的通用对象文件格式)格式文件发展而来。32位成为PE32,64位称为PE+或PE32+。

二、PE文件格式

  1. PE文件种类如下表所示:
种类 主扩展名
可执行系列 EXE, SCR
库系列 DLL, OCX, CPL, DRV
驱动程序系列 SYS, VXD
对象文件系列 OBJ
  1. 基本结构

    使用010editor(二进制文件查看工具)打开一个exe可以看到如下结构:

    PE_struc1

    上图是该exe文件的起始部分,也是PE文件的头部,exe运行所需要的所有信息都存储在PE头中。

    PE_struc2

​     从DOS头到节区头是PE头部分,其下的节区合称为PE体。文件中使用偏移(offset),内存中使用VA(Virtual Address,虚拟地址)来表示位置。文件加载到内存时,情况就会发生变化(节区大小、位置等)。文件的内容一般可分为代码(.text)、数据(.data)、资源(.rsrc)节,分别保存。PE头与各节区的尾部存在一个区域,成为NULL填充。文件/内存中节区的起始位置应该在各文件/内存最小单位的倍数上,空白区域使用NULL进行填充(如上图所示)。

  1. VA&RVA

    VA指进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)指从某个基准未知(ImageBase)开始的相对地址。VA与RVA的换算满足如下公式:

    ​  RVA + IamgeBase = VA

    PE头内部信息主要以RVA的形式进行存储,主要原因是PE文件(主要是DLL)加载到进程虚拟内存的特定位置时, 该位置可能已经加载了其他PE文件(DLL)。此时需要进行重定位将其加载到其他的空白位置,保证程序的正常运行。

三、PE头

  1. DOS头

    主要为现代PE文件可以对早期的DOS文件进行良好兼容存在,其结构体为IMAGE_DOS_HEADER。

    大小为64字节,其中2个重要的成员分别是:

    • e_magic:DOS签名(4D5A,MZ)
    • e_lfanew:指示NT头的偏移(文件不同,值不同)
  2. DOS存根

    stub,位于DOS头下方,可选,大小不固定,由代码与数据混合组成。

  3. NT头

    结构体为IMAGE_NT_HEADERS,大小为F8,由3个成员组成:

    • 签名结构体,值为50450000h(“PE”00)
    • 文件头,表现文件大致属性,结构体为IMAGE_FILE_HEADER,重要成员有4个:
      • Machine:每个CPU都拥有的唯一的Machine码,兼容32位Intel x86芯片的Machine码为14C;
      • NumberOfSections:指出文件中存在的节区数量;
      • SizeOfOptionalHeader:指出结构体IMAGE_OPTIONAL_HEADER32(32位系统)的长度
      • Characteristics:标识文件属性,文件是否是可运行形态、是否为DLL等,以bit OR形式进行组合
    • 可选头,结构体为IMAGE_OPTIONAL_HEADER32,重要成员有9个:
      • Magic:IMAGE_OPTIONAL_HEADER32为10B,IMAGE_OPTIONAL_HEADER64为20B
      • AddressOfEntryPoint:持有EP的RVA值,指出程序最先执行的代码起始地址
      • ImageBase:指出文件的优先装入地址(32位进程虚拟内存范围为:0~7FFFFFFF)
      • SectionAlignment,FileAlignment:前者制定了节区在内存中的最小单位,后者制定了节区在磁盘文件中的最小单位
      • SizeOfImage:指定了PE Image在虚拟内存中所占空间的大小
      • SizeOfHeaders:指出整个PE头的大小
      • Subsystem:区分系统驱动文件和普通可执行文件
      • NumberOfRvaAndSize:指定DataDirectory数组的个数
      • DataDirectory:由IMAGE_DATA_DIRECTORY结构体组成的数组
  4. 节区头

    节区头中定义了各节区的属性,包括不同的特性、访问权限等,结构体为IMAGE_SECTION_HEADER,重要成员有5个:

    • VirtualSize:内存中节区所占大小
    • VirtualAddress:内存中节区起始地址(RVA)
    • SizeOfRawData:磁盘文件中节区所占大小
    • Charateristics:节区属性(bit OR)

四、RVA To RAW

PE文件从磁盘到内存的映射:

  1. 查找RVA所在节区

  2. 使用简单的公式计算文件偏移:

    RAW - PointerToRawData = RVA - ImageBase

    RAW = RVA - ImageBase + PointerToRawData

example:ImageBase为0x10000000,节区为.text,文件中起始地址为0x00000400,内存中的起始地址为0x01001000,RVA = 5000,RAW = 5000 - 1000 + 400 = 4400。

免费评分

参与人数 1吾爱币 +5 热心值 +1 收起 理由
Hmily + 5 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
jamescookers988 发表于 2020-3-8 23:01
pe结构图!
推荐
jafck 发表于 2020-3-8 15:10
kof888 发表于 2020-3-8 14:02
图片看不到啊啊啊啊啊

直接看书好了:《windows pe权威指南》 《UEFI原理与编程》 戴正华(著)   以及Windows internals 系列
沙发
活着的龙 发表于 2020-3-8 12:14
向lz学习了。有无pe文件分析的图片?那样会更好理解点~ 谢谢
3#
gh0st_ 发表于 2020-3-8 12:17
有没有64位PE的
4#
 楼主| yaoyao7 发表于 2020-3-8 12:53 <
活着的龙 发表于 2020-3-8 12:14
向lz学习了。有无pe文件分析的图片?那样会更好理解点~ 谢谢

文章中有图片,可能需要科学上网  我放在图床上了
5#
 楼主| yaoyao7 发表于 2020-3-8 13:21 <

暂时还没有  后续可能会更
6#
kof888 发表于 2020-3-8 14:02
图片看不到啊啊啊啊啊
7#
相信 发表于 2020-3-8 14:06
感谢分享
9#
netCheney 发表于 2020-3-8 17:56
小白感觉PE好像是装机专用的,哈哈,谢谢楼主,学习了
10#
xdnice 发表于 2020-3-8 18:48
图片挂了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2020-4-8 03:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表