博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows加载器加载PE文件
阅读量:2065 次
发布时间:2019-04-29

本文共 566 字,大约阅读时间需要 1 分钟。

 

加载器读取一个PE文件的过程如下:

1. 先读入PE文件的DOS头,PE头和Section头。

2. 然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。

3. 根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定义的数据来修改所映射的页的属性。

4. 如果文件被加载的地址不是ImageBase定义的地址,则重新修正ImageBase。

5. 根据PE文件的输入表加载所需要的DLL到进程空间。

6. 然后替换IAT表内的数据为实际调用函数的地址。

7. 根据PE头内的数据生成初始化的堆和栈。

8. 创建初始化线程,开始运行进程。

 

这里要提的是加载PE文件所需DLL的过程是建立在六个底层的API上。

LdrpCheckForLoadedDll:检查要加载的模块是否已经存在。

LdrpMapDll:映射模块和所需信息到内存。

LdrpWalkImportDescriptor:遍历模块的输入表来加载其所需的其他模块。

LdrpUpdateLoadCount:计数模块的使用次数。

LdrpRunInitializeRoutines:初始化模块。

LdrpClearLoadInProgress:清除某些标志,表明加载已经完成。

转载地址:http://ppumf.baihongyu.com/

你可能感兴趣的文章
Go语言学习Part1:包、变量和函数
查看>>
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
Leetcode C++ 剑指 Offer 09. 用两个栈实现队列
查看>>
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>