zoukankan      html  css  js  c++  java
  • 第16章:基址重定位(2)

    PE重定位

    使得硬编码在程序中的内存地址随当前加载地址的变化而变化就是PE重定位.

    若不添加重定位,而加载时内存地址被占用,则会出现"内存地址引用错误",使得程序异常终止.

    PE重定位的操作原理:

    查找硬编码地址需要用到重定位表(Relocation Table),它是记录硬编码地址偏移列表.是PE文件构建过程中(编译/链接的时候提供的).

    重定位表在Image_optional_header/DataDirectory[5]中可找到地址,转化为FileOffset即可.

    查看各个节区头的信息,发现在reloc节区中,直接查该节区头的PointerToRawData字段中的地址.即红色框起来的四字节.

    SizeOfBlock后面跟着的元素是很多两字节的TypeOffset.末端以0结尾.

    第一个为例:3424. 高四位(此处是3)是重定位类型,低12位(此处是424)是偏移.

    在网上搜索可知,在Windows中只采用的Image_Rel_Based_HighLow(3)这种类型.

    硬编码地址的计算为:1000(Virtual Address)+3424(Offset) = 1324(FileOffset).

    转到地址1424处,值大小为4字节,此处为010010c8:

     在可选头中查找到ImageBase值,一般来说是1000000.

    偏移地址为010010c8-1000000 = 10c8.从系统获取程序实际加载的基地址,二者相加即可得到重定位地址.

     此处就是10c8+210000 = 2110c8即可看到导入的DLL的函数地址.

    增加一个空节区:

    第一:修改SizeOfImage 大小,需要约进到SectionAlignment.

    第二:修改FileHeader中的NumberOfSections.

    第三:添加节区头,根据前面的节区,计算得到后面的值,其中VirtualSize可以为0,但是SizeOfRawData不能为0.DLL属性可以不填.

    需要注意的一点是,如果PE文件中末地址没有包含到自己添加的节区,那么需要自己添加0填充,直到自己添加节区的末地址.

  • 相关阅读:
    Yii调试插件yii-debug-toolbar的使用
    IE8不支持indexOf的解决办法
    使用wkhtmltopdf的一些事情
    mac sourcetree 启用 Beyond compare
    Java基础学习之(5)--impact和package
    Java基础学习之(3)--面向对象2--重载
    Java基础学习之(4)--面向对象3--this+static关键字
    Java基础学习之(2)--面向对象1
    Java基础学习之(1)--标识符、关键字、数据类型
    java学习(7)iterator迭代器
  • 原文地址:https://www.cnblogs.com/Rev-omi/p/13252682.html
Copyright © 2011-2022 走看看