zoukankan      html  css  js  c++  java
  • 二进制文件概述

    《软件漏洞分析技术》笔记

    PE文件:

      PE(Portable Executable)是win32平台下可执行遵守的数据格式。平时常见的比如*.exe和*.dll都是PE文件。

      可执行文件:包含二进制代码,字符串,菜单,图标,位图字体等。

      运行时操作系统会按PE文件的约定定位资源并装载入内存。可执行文件 ——>拆分——>若干数据节<——不同的资源。

      典型PE文件通常包含:.text(编译器产生,存放二进制代码, 反汇编和调试的对象)、.data(初始化数据块)、.idata(使用的外来函数如动态链接库与文件信息)、.rsrc(存放程序资源),还包括其他如.reloc、.edata、.tls、.rdata等。

    虚拟内存:

      Windows内存:1.物理内存层面;2.虚拟内存层面。

      物理内存通常内核级别ring0才能看到;通常用户模式下看见的为Windows用户态内存映射机制下的虚拟内存。

      内存管理器可以使进程在实际只有512MB物理内存的情况下使进程“认为”自己拥有4GB内存(其中包括代码, 栈空间,资源区,动态链接库等)。

      这种情况和实际生活中银行相似,你需要用的钱其实并不等于你拥有的财富,银行实际存有的金额数小于所有储户的财富和。

      那万一有用户需要取出超出实际金额数怎么办,操作系统原理中有“虚拟内存”概念, 即在这种情况下有时会将“部分硬盘空间”暂时作为内存使用。(两者“虚拟内存“概念对象不一,不宜混淆)

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

      (1).文件偏移地址(File Offset):数据在PE文件中的地址,在磁盘上存放时相对于文件开头的偏移。

      (2).装载基址(Image Base):PE装入内存时的基地址。默认EXE文件在内存中的基地址为0x00400000,DLL为0x10000000。当然位置可由编译选项更改。

      (3).虚拟内存地址(Virtual Address,VA):PE文件中的指令被装入内存后的地址。

      (4).相对虚拟地址(Relative Virtual Address,RVA):内存地址相对于映射基址(即装载基址)的偏移量。

      VA、Image Base、RVA之间关系:

            VA = Image Base + RVA;

      可理解为: 实际 = 基点 + 位移.

      默认情况下:一般PE文件的0字节 =》虚拟内存0x00400000位置,即所谓的装载地址。

      装载PE文件时,文件偏移地址(磁盘上)与RVA(内存上)有很大一致性(操作系统会尽量保持PE中各数据结构),那同样会有细微差异,由文件数据和内存数据的存放单位不同造成。

      在PE文件中,以磁盘数据标准存放(我们知道硬盘以一个section为基本单位,即512byte),0x200字节,当一个数据节不足0x200字节时填充0x00;

      而在内存中,则以0x1000字节(4byte)为基本单位进行组织,其他与前者类似。

      在进行File Offset和VA换算时,会由存储单位引起节基址差称为节偏移。比如:

      则有:

      那么就可以计算出:

      FileOffset = VA - Image Base -节偏移

            = VA - Image Base - (相对虚拟偏移量 - 文件偏移量)

      按上表,比如计算虚拟内存中0x00404141处的一条指令,要换算出该指令在文件中的偏移量:

          文件偏移量 = 0x00404141 - 0x00400000(默认的Image Base)-(0x1000 - 0x400)(代码存于.text文件中) = 0x3541

      一些PE工具也提供这类地址转化:Lord PE.

     =_=..

  • 相关阅读:
    IntelliJ IDEA注册码
    linux中patch命令 -p 选项
    设备文件简介
    《算法导论》——矩阵
    《算法导论》——数论
    linux常用查看硬件设备信息命令(转载)
    netstat和telnet命令在Windows7中的用法(转载)
    c++容器使用总结(转载)
    离散数学——数论算法
    c语言中内存对齐问题
  • 原文地址:https://www.cnblogs.com/zUotTe0/p/8811282.html
Copyright © 2011-2022 走看看