12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 231|回复: 0

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

[复制链接]

312

主题

312

帖子

634

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
634
发表于 2021-7-26 00:07:24 | 显示全部楼层 |阅读模式
PE文件格式详细剖析(一)

一、PE文件根本介绍

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


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

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

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

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

  • VA&RVA
    VA指进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)指从某个基准未知(ImageBase)开始的相对地址。VA与RVA的换算满足如下公式:
    ​  RVA + IamgeBase = VA
    PE头内部信息重要以RVA的形式进行存储,重要原因是PE文件(重要是DLL)加载到进程虚拟内存的特定位置时, 该位置可能已经加载了其他PE文件(DLL)。此时需要进行重定位将其加载到其他的空白位置,包管程序的正常运行。
三、PE头


  • DOS头
    重要为现代PE文件可以对早期的DOS文件进行良好兼容存在,其结构体为IMAGE_DOS_HEADER。
    巨细为64字节,其中2个重要的成员分别是:

    • e_magic:DOS签名(4D5A,MZ)
    • e_lfanew:指示NT头的偏移(文件差别,值差别)

  • DOS存根
    stub,位于DOS头下方,可选,巨细不固定,由代码与数据混合组成。
  • 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结构体组成的数组


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

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

四、RVA To RAW

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

  • 查找RVA所在节区
  • 使用简单的公式计算文件偏移:
    RAW - PointerToRawData = RVA - ImageBase
    RAW = RVA - ImageBase + PointerToRawData
example:ImageBase为0x10000000,节区为.text,文件中起始地址为0x00000400,内存中的起始地址为0x01001000,RVA = 5000,RAW = 5000 - 1000 + 400 = 4400。

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-5 08:35 , Processed in 0.109375 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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