PE(Portable Execute)文件是WIN32下可运行文件遵循的数据格式,也是反汇编调试不可缺少的文件,常见的pe文件有.exe和.dll文件。本文主要介绍pe文件的结构和虚拟内存地址转换到文件地址的方法。

pe文件的基本结构

主要的pe文件主要包含下面部分:例如以下图

  • .text节:由编译器产生,村反击本的二进制机器码,我们调试非常烦会变得而主要对象。
  • .data节:数据块,宏定义,全局变量,静态变量等。
  • .idata节:可运行文件使用的动态链接库和外来函数信息与文件信息等。
  • .rsrc节:承训的资源,图标,菜单等

几个重要概念

上面简介了pe的基本结构,如今结合下图,介绍几个存储地址的基本概念,为后面的地址转换做准备。

  • 文件偏移地址:主要指的是文件里内容相对于文件开头的偏移量(a-0)。因此文件地址从开头的0開始依次添加。
  • 装载地址(image base):主要指的是程序执行时候装载在内存中时候,非配给该文件的首要内存地址(400000),也就是装载地址位置存放的是文件地址为0处的文件。
  • 虚拟内存地址(virtual address,VA):文件被装入内存后的内存地址(b)。
  • 相对虚拟地址(relative virtual address,RVA):文件被装入到内存后的地址与装载基址的距离(b-400000),即相对于装载基址的偏移量(内存地址VA-装载基址IMAGE BASE)。

注意:文件偏移地址≠相对虚拟地址,主要原因是:文件偏移地址是相对于在磁盘存放时候的偏移量,而磁盘以0×200(0.5k)为单位,每一个节占用的大小为0×200的倍数(多拆少补0×00),而相对虚拟地址是相对于内存的偏移量,而内存以0×1000(1K)为单位,每一个节占用的大小为0×1000的倍数(多拆少补0×00)。由此产生每一个节的差量称为为节偏移(.text节的节偏移为(d-4000)-(c-0),即为填充部分),映射方式例如以下图:

文件偏移地址与虚拟内存地址的转换

因此如今我们能够通过IDA得到虚拟内存地址(VA)为b,通过LordPE能够得出节偏移(d-c),然后就可以得出a的地址为(a=b-400000-[(d-400000)-(c-0)]),总结成公式即为:

文件偏移地址=VA-Image Base-节偏移

本文出自个人博客:PE文件简单介绍

以上内容基于阅读《0day安全:软件漏洞分析》后个人理解

PE文件简单介绍的更多相关文章

  1. Core文件简单介绍及生成设置方法

    Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...

  2. CocoaPods常用终端命令及Profile文件简单介绍

    Pod常用终端命令 pod init 创建pod文件 pod install 开始安装第三方框架,如果网上有更新,会安装最新的 pod install --verbose--no-repo-updat ...

  3. Java Web中web.xml文件简单介绍

    参考博客: https://www.cnblogs.com/Y-oung/p/8401549.html 1.XML 声明和根元素 <?xml version="1.0" en ...

  4. Maven Pom.xml文件简单介绍

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. pom.xml(Project Object Model) 文件简单介绍

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  6. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  7. 【黑客免杀攻防】读书笔记6 - PE文件知识在免杀中的应用

    0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描. 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的. 修改区段名 1.1 移动PE文件头位置免杀 工具:PeC ...

  8. PHP 关于文件操作的简单介绍

    文件操作一直是Web程序员头疼的地方,而文件操作在CMS这样的系统中又是必须的.如今,PHP文件操作的函数内容已经非常强大,文件这部分也是学习PHP非常重要的一部分,希望大家不要忽略.这篇文章会简单介 ...

  9. [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件

    转自:http://blog.csdn.net/dbzhang800/article/details/6348432 简单介绍一下 *.pro.*.pri.*.prf.*.prl等四种文件:干嘛用的, ...

随机推荐

  1. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  2. 新建linux组、用户命令

    之前在安装oracle的时候,出现了一个问题:安装Oracle,新建组.用户的时候的一个错误.看这篇博客前,先看这个链接,学习要从解决出现的问题出手. 建立用户组和用户 下面总结一下Linux建立组和 ...

  3. centos安装epel源

    用163的源,但是我发现这个源里面,根本没有libmcrypt libmcrypt-devel这二个包,装php扩展mcrypt时,又要用到这二个包,所以我手动装了libmcrypt包,但是给我的感觉 ...

  4. Delphi 编写系统服务(服务控制线程:开始,暂停,继续,停止)

    打开Delphi 7,新建,选择Other->Service Application 修改属性中Name和DisplayName,Name是Service的名称,决定着进程的标识,Display ...

  5. 链接分析算法之:HITS算法

    链接分析算法之:HITS算法     HITS(HITS(Hyperlink - Induced Topic Search) ) 算法是由康奈尔大学( Cornell University ) 的Jo ...

  6. redis缓存工具Jedis进行跨jvm加锁(分布式应用)--不幸暂弃用--能够做第三方锁使用

    近期使用redis碰到了多个并发处理同一个缓存的情况.在这样的情况下须要进行加锁机制. 本来想使用java自带的ReadWriteLock进行设置读写锁,这也是上家公司使用的方法. 后来经过商讨,给予 ...

  7. 【QT相关】类头文件解读、QT编辑模式、读取text文本

    Wizard产生的头文件类包含了必须的#include文件.构造函数.析构函数和UI对象: #include <QMainWindow> namespace Ui {class Notep ...

  8. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  9. JVM 指令集合

    指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int ...

  10. Google Code Jam Round 1A 2015 Problem B. Haircut 二分

    Problem You are waiting in a long line to get a haircut at a trendy barber shop. The shop has B barb ...