PE文件到内存的映射

http://www.cnblogs.com/qintangtao/archive/2013/01/28/2880606.html
在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制。也就是说,windows 装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系。
当且仅当真正执行到某个内存页中的指令或者访问某一页中的数据时,这个页面才会被从磁盘提交到物理内存,这种机制使文件装入的速度和文件大小没有太大的关系。

但是要注意的是,系统装载可执行文件的方法又不完全等同于内存映射文件。
当使用内存映射文件的时候,系统对“原著”相当忠实,如果将磁盘文件和内存映像比较的话,可以发现不管是数据本身还是数据之间的相对位置它丫丫的都是完全相同的。
而我们知道,在装载可执行文件的时候,有些数据在装入前会被预处理,如重定位等,正因此,装入以后,数据之间的相对位置可能发生微妙的变化。

Windows 装载器在装载DOS部分、PE文件头部分和节表(区块表)部分是不进行任何特殊处理的,而在装载节(区块)的时候则会自动按节(区块)的属性做不同的处理。
一般情况下,它会处理以下几个方面的内容:

内存页的属性;
节的偏移地址;
节的尺寸;
不进行映射的节。

内存页的属性:

对于磁盘映射文件来说,所有的页都是按照磁盘映射文件函数指定的属性设置的。但是在装载可执行文件时,与节对应的内存页属性要按照节的属性来设置。所以,在同属于一个模块的内存

页中,从不同节映射过来的的内存页的属性是不同的。

节的偏移地址:

节的起始地址在磁盘文件中是按照 IMAGE_OPTIONAL_HEADER32 结构的 FileAlignment 字段的值进行对齐的,而当被加载到内存中时是按照同一结构中的 SectionAlignment 字段的值对其的

,两者的值可能不同,所以一个节被装入内存后相对于文件头的偏移和在磁盘文件中的偏移可能是不同的。

注意,节事实上就是相同属性数据的组合!当节被装入到内存中的时候,相同一个节所对应的内存页都将被赋予相同的页属性, 事实上,Windows 系统对内存属性的设置是以页为单位进行的

,所以节在内存中的对齐单位必须至少是一个页的大小。(小甲鱼温馨提示:对于32位操作系统来说,这个值一般是4KB==1000H; 对于64位操作系统这个值一般是8KB==2000H)

在磁盘中就没有这个**,因为在磁盘中排放是以什么为主?肯定是以空间为主导,在磁盘只是存放,不是使用,所以不用设置那么详细的属性。试想想看,如果在磁盘中都是以4KB为大小对齐

的话,不够就用0来填充,那么一个只占20字节的数据就要消耗4KB的空间来存放,是不是浪费?有木有??

节的尺寸:

对节的尺寸的处理主要分为两个方面:

第一个方面,正如刚刚我们所讲的,由于磁盘映像和内存映像中节对齐存储单位的不同而导致了长度扩展不同(填充的0数量不同嘛~);

第二个方面,是对于包含未初始化数据的节的处理问题。既然是未初始化,那么没有必要为其在磁盘中浪费空间资源,但在内存中不同,因为程序一运行,之前未初始化的数据便有可能要被

赋值初始化,那么就必须为他们留下空间。

不进行映射的节:

有些节并不需要被映射到内存中,例如.reloc节,重定位数据对于文件的执行代码来说是透明的,无作用的,它只是提供Windows 装载器使用,执行代码根本不会去访问到它们,所以没有必

要将他们映射到物理内存中。

========

PE文件与虚拟内存之间的映射

http://blog.chinaunix.net/uid-26898698-id-3181820.html
文件偏移:静态反汇编工具看到的PE文件中某条指令的位置是相对于磁盘文件的。IDA Pro虽然是静态反汇编工具,不过出来的是VA。
文件偏移地址(File Offset):数据在PE文件中的地址,是文件在磁盘上存放时想对于文件开头的偏移。
装载基址(Image Base):PE文件装入内存的 基地址。默认情况下,EXE文件的基址为0x00400000,DLL文件的基址为0x10000000。
虚拟内存地址(VA):PE文件中的指令被装入内存后的地址,OllyDbg动态反汇编产生。
相对虚拟地址(RVA):内存地址相对与映射基址的偏移量。
VA = Image Base + RVA。
PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织。 代码装入内存后,将按照内存数据标准存放,以0x1000字节为基本单位进行组织。
========

PE文件到内存的映射学习总结相关推荐

  1. 黑客攻击-木马免杀之PE文件

    当你好不容易弄出来一个木马(具体可参考这里)的时候,却被杀毒软件轻易的就检测出来了,那一切岂不是白费了.Win10中的windows defender基于流量检测很容易把常见的木马程序检测出来,那怎么 ...

  2. 软件安全学习笔记(7):PE文件总体格式

    1.MS-DOS MZ文件头(64个字节) 定位PE文件头开始位置,也用于PE文件合法性检测.最后四个字节(3C处):PE文件头开始位置 2.DOS Stub 一段小的DOS程序 3.PE heade ...

  3. 4.2 x64dbg 针对PE文件的扫描

    通过运用LyScript插件并配合pefile模块,即可实现对特定PE文件的扫描功能,例如载入PE程序到内存,验证PE启用的保护方式,计算PE节区内存特征,文件FOA与内存VA转换等功能的实现,首先简 ...

  4. 【Android 逆向】Android 逆向基本概念 ( 软件运行时内存结构 | 文件与内存之间的联系 )

    文章目录 一.Android 软件运行时内存结构 二.Android 文件与内存之间的联系 一.Android 软件运行时内存结构 Android 软件运行时内存结构 : 硬件层 : 内存中 , 硬件 ...

  5. 图解VC++版PE文件解析器源码分析

    该源码下载自 http://download.csdn.net/download/witch_soya/4979587 1 Understand 分析的图表 2 PE结构解析的主要代码简要分析 首先看 ...

  6. 32查运行内存的map文件_Linux进程间通信——内存共享映射

    一.概念 什么是内存共享映射? 将磁盘文件的一部分直接映射到内存中 共享内存,就是两个或多个进程都可以访问的同一块内存空间,一个进程对这块空间内容的修改可为其他参与通信的进程所看到的 映射种类 共享映 ...

  7. PE文件感染和内存驻留

    这次,作者将和大家一起讨论病毒的感染技术.另外,从本文开始,我们将陆续接触到一些病毒的高级编码技术.例如,内存驻留.EPO(入口点模糊)技术.加密技术.多态和变形等.通过这些高级技巧,你将进一步感受到 ...

  8. 网络安全学习第6篇 - 爆破及PE文件解释

    1.请采用暴力破解的方式去尝试破解crack.exe文件(在实验报告中说明破解原理即可,无需提交破解后的文件) 2.请依据参考文档中的内容编写一个小程序,使其可以实现如下功能: ①判断一个文件是否为P ...

  9. 虚拟内存及PE文件与虚拟内存之间的映射

    虚拟内存         Windows 的内存可以被分为两个层面:物理内存和虚拟内存.         如图 1.2.1 所示,Windows 让所有的进程都"相信"自己拥有独立 ...

最新文章

  1. 人本质要好,要善良,要真诚,有格局和胸怀,有能力,有眼光,能讲故事,能找到人,能搞到钱...
  2. linux几种常见的Shell:sh、bash、csh、tcsh、ash
  3. 未来人工智能客户服务的5大优势
  4. Python高手之路【二】python基本数据类型
  5. 【PC工具】U盘数据加密工具,windows自带U盘文件加密工具体验,测试加密时间...
  6. Qt Creator指定环境设置
  7. 转]SQLServerDBA十大必备工具
  8. matlab搭建sdn,软件定义网络SDN简介和简单仿真实验
  9. 众望所归!中国机器狗能【后空翻】了。。。
  10. 使用javascript模拟常见数据结构(四)
  11. 两篇 Spring 总结(一)
  12. Java数据结构——代码实现顺序表的操作
  13. 【c4d学习笔记】OC渲染器安装问题
  14. R语言拟合ARIMA模型
  15. Quartus-II 三种方式进行D触发器仿真
  16. 免流服务器稳定吗,什么是免流服务器
  17. 美团外卖自动化业务运维系统建设
  18. 磁盘碎片与闪存摩擦均衡介绍
  19. 服务器主机是什么系统版本,服务器主机是什么系统
  20. TEWA-600AEM天翼光猫超级管理员密码获取

热门文章

  1. jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
  2. 计算机网络知识点3——数据交换(报文交换、分组交换)
  3. Mac 技术篇-Oracle数据库连接工具SQL Developer启用、关闭自动提交事务,设置自动commit
  4. PyQt5 技术篇-设置QComboBox下拉框默认值,获取下拉框当前选择的内容
  5. CTFshow php特性 web91
  6. 【2015沈阳现场A】
  7. 第五周实践项目6 数制转换(栈)
  8. rot90--矩阵旋转
  9. 整数划分问题(递归法)
  10. OpenCV的支持向量机SVM的程序