1.1二进制文件概述
1.1PE文件格式
PE(Portable Exec utable)是Win32平台下可执行文件遵守的数据格式。常见的可执行文件(如“*.exe”文件和“*.dll”文件)都是典型的PE文件。
一个可执行文件不光包含了二进制的机器代码,还会自带许多其他信息,如字符串、菜单、图标、位图、字体等。PE文件格式规定了所有的这些信息在可执行文件中如何组织。在程序被执行时,操作系统会按照PE文件格式的约定去相应的地方准确地定位各种类型的资源,并分别装入内存的不同区域。
PE文件格式把可执行文件分成若干个数据结(section),不同的资源被存放在不同的节中。一个典型的PE文件中包含的节如下。
.text 由编译器产生,存放着二进制的机器代码,也就是我们反汇编和调试的对象;
.data 初始化的数据块,如宏定义、全局变量、静态变量等;
.idata 可执行文件所使用的动态链接库等外来函数与文件的信息;
.rsrc 存放程序的资源,如图标、菜单等;
除此之外,还可能出现的节包括“.reloc”、“.edata"等。
1.2虚拟内存
Windows的内存可以被分为两个层面:物理内存和虚拟内存。物理内存需要进入到windows内核级别ring0才能看到。通常,在用户模式下,我们用调试器看到的内存地址都是虚拟内存。
windows让所有的进程都”相信“自己拥有独立的4GB内存空间,但是,计算机实际内存条可能只有512MB,怎么可能为所有进程都分配4GB的内存呢?这一切都是通过虚拟内存管理器的映射做到的。
进程所拥有的4GB虚拟内存中包含了程序运行时所需的资源,比如代码、栈空间、堆空间等。
1.3PE文件与虚拟内存的映射
在调试漏洞时,可能经常需要做这样两种操作:
(1)静态反汇编工具看到的PE文件中某条指令的位置是相对于磁盘文件而言的,即所谓的文件偏移;
(2)在调试时看到的某条指令的地址是虚拟内存地址(VA),我们也经常需要回到PE文件中找到这条指令对应的机器码。
为此,我们需要弄清楚PE文件地址和虚拟内存地址之间的映射关系。首先,我们先看看几个重要概念:
1)文件偏移地址(File Offset)
数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。
2)装载基址(Image Base)
PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000。这些位置可以通过修改编译选项更改。
3)虚拟内存地址(Virtual Address,VA)
PE文件中的指令被装入内存后的地址。
4)相对虚拟地址(Relation Virtual Address,RVA)
相对虚拟地址是内存地址相对于映射基址的偏移量。
虚拟内存地址、映射基址、相对虚拟内存地址三者之间的关系:
VA=Image Base+RVA
如下图,在默认情况下,一般PE文件的0字节将对映到虚拟内存的0x00400000位置,这个地址就是所谓的装载地址(Image Base)。
文件偏移是相对于文件开始处0字节的偏移,RVA(相对虚拟地址)则是相对于装载基址0x00400000处的偏移。由于操作系统在进行装载时“基本”上保持PE中的各种数据结构,所以文件偏移地址和RVA有很大的一致性。
之所以说“基本”上一致是因为还有一些细微的差异。这些差异是由于文件数据的存放单位与内存数据存放单位不同而造成的。
1)PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织。当一个数据节(section)不足0x200字节时,不足的地方将被0x00填充;当一个数据节超过0x200字节时,下一个0x200块将被分配给这个节使用。因此PE数据节的大小永远是0x200的整数倍。
2)当代码装入内存后,将按照内存数据标准存放,并以0x1000字节为基本单位进行组织。类似地,不足将被补全,若超出将分配下一个0x1000为其所用。因此,内存中的节总是0x1000的整数倍。
下表列出了文件偏移地址和RVA之间的对应关系:
节(section) | 相对虚拟偏移量RVA | 文件偏移量 |
.text 0x00001000 | 0x0400 | |
.rdata 0x00007000 | 0x6200 | |
.data 0x00009000 | 0x7400 | |
.rsrc 0x0002D | 000 | 0x7800 |
由存储单位差异引起的节基址差称为节偏移。文件偏移地址与虚拟内存地址之间的换算关系也可以表示:
文件偏移地址=虚拟偏移地址(VA)-装载基址(Image Base)-节偏移
=RVA-节偏移
1.1二进制文件概述相关推荐
- 0day安全:软件漏洞分析技术(第2版)
0day安全:软件漏洞分析技术(第2版) 基本信息 作者:王清 张东辉 周浩 王继刚 赵双 丛书名:安全技术大系 出版社:电子工业出版社 ISBN:9787121133961 上架时间 ...
- 0day安全:软件漏洞分析技术(第2版)pdf
下载地址:网盘下载 内容简介 · · · · · · 本书分为4篇17章,系统全面地介绍了Windows平台缓冲区溢出漏洞的分析.检测与防护.第一篇为常用工具和基础知识的介绍:第二篇从攻击者的视角出 ...
- 《0day安全:软件漏洞分析技术》学习笔记·1(需要补充节部分)
文章目录 基础知识 漏洞概述 漏洞挖掘 漏洞分析 漏洞利用 漏洞在安全中的应用 二进制文件概述 PE文件格式 虚拟内存 PE文件与虚拟内存之间的映射 基础知识 漏洞概述 通常把这类能够引起软件做一 ...
- 软件漏洞分析技术(一)
目录 1.1 关于漏洞 1.1.1 bug与漏洞 1.1.2 几个经典的安全问题 1.1.3 漏洞挖掘.分析及利用 1.1.4 漏洞的公布与0 day响应 1.2 二进制文件概述 1.2.1 PE文件 ...
- php编译成二进制文件_JVM字节码文件概述
字节码文件概述 字节码文件的跨平台性 Java语言:跨平台的语言 当Java源代码成功编译字节码后,如果想在不同的平台上面运行,则无需再次编译 这个优势目前来说已经不再吸引人,因为Python.PHP ...
- [每日一讲] Python系列:Python概述
Python 序章 概述 Python 是弱类型动态解释型的面向对象高级语言,其具备面向对象的三大特点:封装.继承.多态.Python 代码运行时,其有一个编译过程,通过编译器生成 .pyc 字节码 ...
- netty 文件传输服务器,Netty之二进制文件传输
传输会话简要 客户端发起一个文本请求给服务器端, 服务器端解析里面文本, 返回文件给客户端, 客户端解析文件 服务器端 因为示例文件比较小, 所以没有做分段传输, 而是直接一次性把整个文件byte[] ...
- ORACLE初始化参数文件概述
ORACLE初始化参数文件概述 在9i之前,参数文件只有一种,它是文本格式的,称为pfile,在9i及以后的版本中,新增了服务器参数文件,称为spfile,它是二进制格式的.这两种参数文件都是用来存储 ...
- C#二进制文件编程实践
C#读写二进制文件 http://www.cnblogs.com/top5/archive/2011/02/07/1949675.html 本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁 ...
最新文章
- python使用matplotlib可视化、自定义Y轴轴标签刻度旋转的角度(customize degree rotating axis tick labels in matplotlib)
- 驱动中获取PsActiveProcessHead变量地址的五种方法
- java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别
- mongodb常用语句(集合操作)
- 互联网金融时代下机器学习与大数据风控系统
- SharePoint 2013 对二进制大型对象(BLOB)进行爬网
- javascript 检测密码强度 美化版
- 常用正则表达式大全(Xss防范、sql注入、手机邮箱验证等等,持续补充~)
- 商城管理系统源码 商城APP源码 电子商城源码
- DDD领域驱动设计实战(六)-领域服务
- 硬盘 SMART 检测参数详解
- AutoSAR系列讲解(入门篇)6.1-Vector的工具链简介
- 我开发过程中遇到的Echarts地图立体描边问题解决方式
- Java(转型-多态-契约)
- [RK3288][Android6.0] WiFi的dts配置说明(AP6335)
- Vue2 的 diff 算法
- JS事件笔记:音乐播放器
- springboot+mybatis多数据源配置
- Scintilla MFC使用教程
- 自己动手写一个操作系统——loader(1)