PE执行流程

PE 文件的执行顺序

  1. 当一个 PE 文件 被执行时,PE 装载器 首先检查 DOS header 里的 PE header 的偏移量。如果找到,则直接跳转到 PE header 的位置。
  2. 当 PE装载器 跳转到 PE header 后,第二步要做的就是检查 PE header 是否有效。如果该 PE header 有效,就跳转到 PE header 的尾部。
  3. 紧跟 PE header 尾部的是节表。PE装载器执行完第二步后开始读取节表中的节段信息,并采用文件映射( 在执行一个PE文件的时候,Windows并不在一开始就将整个文件读入内存,而是采用与内存映射的机制,也就是说,Windows装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令或者访问某一页中的数据时,这个页面才会被从磁盘提交到物理内存,这种机制使文件装入的速度和文件大小没有太大的关系 )的方法将这些节段映射到内存,同时附上节表里指定节段的读写属性
  4. PE文件映射入内存后,PE装载器将继续处理PE文件中类似 import table (输入表)的逻辑部分。

PE 文件结构说明:

  1. DOS头 是用来兼容 MS-DOS 操作系统的,目的是当这个文件在 MS-DOS 上运行时提示一段文字,大部分情况下是:This program cannot be run in DOS mode. 还有一个目的,就是指明 NT 头在文件中的位置。
  2. NT头 包含 windows PE 文件的主要信息,其中包括一个 'PE' 字样的签名PE文件头(IMAGE_FILE_HEADER)和 PE可选头(IMAGE_OPTIONAL_HEADER32)。
  3. 节表:是 PE 文件后续节的描述,windows 根据节表的描述加载每个节。
  4. :每个节实际上是一个容器,可以包含 代码、数据 等等,每个节可以有独立的内存权限,比如代码节默认有读/执行权限,节的名字和数量可以自己定义,未必是上图中的三个。

详细解释如下:

PE(Portable Executable)文件是Windows操作系统中可执行文件的一种格式。PE文件的执行顺序如下:
1. 加载器(Loader):当执行PE文件时,操作系统的加载器负责将PE文件加载到内存中。加载器会解析PE文件的文件头和节表,并将相关的节(Sections)加载到内存中。
2. 初始化(Initialization):加载器会执行PE文件的初始化代码,包括运行全局变量的初始化和执行静态构造函数等操作。
3. 入口点(Entry Point):PE文件中定义了一个入口点(Entry Point)函数,通常命名为`main`或`WinMain`。加载器会跳转到入口点函数,开始执行程序的主逻辑。
4. 执行程序主逻辑:在入口点函数中,程序会按照编写的逻辑执行相应的指令和操作。这包括处理用户输入、调用函数、执行算法等。
5. 结束执行:当程序执行完入口点函数中的代码,或者遇到`return`语句或`exit`函数调用时,程序会退出执行。加载器负责释放相关资源并终止程序的执行。
需要注意的是,PE文件的执行顺序可能还会涉及其他操作,如动态链接库的加载、异常处理机制等。此外,具体的执行顺序也可能会受到编程语言、编译器和操作系统的影响。以上是一般情况下PE文件的执行顺序。

当执行PE文件时,会按照以下步骤进行深入解释:
1. DOS头(DOS Header):PE文件以一个DOS头开始,这是为了兼容早期的MS-DOS系统。DOS头中包含了一些DOS特定信息和可执行文件的入口点。
2. 文件头(File Header):文件头包含了PE文件的基本信息,如文件类型、架构、节表的偏移等。加载器会解析文件头以确定PE文件的属性和结构。
3. 可选头(Optional Header):可选头包含了PE文件的一些可选属性,如程序入口点地址、内存对齐方式、数据目录等。可选头的结构和内容因不同的架构而异。
4. 节表(Section Table):节表记录了PE文件中各个节的信息,如代码节、数据节、资源节等。加载器会根据节表的信息将相应的节加载到内存中。
5. 导入表(Import Table):如果PE文件依赖于其他动态链接库(DLL),导入表会记录所依赖的库和函数。加载器会解析导入表,并加载相应的DLL以满足程序的调用需求。
6. 重定位表(Base Relocation Table):如果PE文件需要以其他基址加载,重定位表会记录需要修改的内存地址。加载器会根据重定位表进行地址修正,以确保程序在不同的内存基址上正确执行。
7. 初始化(Initialization):加载器会执行PE文件的初始化代码,包括运行全局变量的初始化和执行静态构造函数等。这些初始化操作会准备好程序运行所需的环境。
8. 入口点(Entry Point):PE文件中定义了一个入口点(Entry Point)函数,通常命名为`main`或`WinMain`。加载器会跳转到入口点函数,开始执行程序的主逻辑。
9. 执行程序主逻辑:在入口点函数中,程序会按照编写的逻辑执行相应的指令和操作。这包括处理用户输入、调用函数、执行算法等。
10. 结束执行:当程序执行完入口点函数中的代码,或者遇到`return`语句或`exit`函数调用时,程序会退出执行。加载器负责释放相关资源并终止程序的执行。
以上是PE文件的深入解释和执行过程的逐步说明。不同的PE文件可能具有不同的结构和特性,执行过程可能会因具体情况而有所不同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值