zoukankan      html  css  js  c++  java
  • PE文件结构(五岁以下儿童)基地搬迁

    PE文件结构(五岁以下儿童)


    參考

    书:《加密与解密》

    视频:小甲鱼 解密系列 视频


    基址重定位


            链接器生成一个PE文件时,它会如果程序被装入时使用的默认ImageBase基地址(VC默认exe基地址00400000h。dll基地址10000000h),而且会把代码中全部指令中用到的地址都使用默认的基地址(比如 程序代码中 push 10001000,就是把10000000h当做了基地址,把push 10001000写入到文件里)。如果一个exe程序中一个dll装载时的地址与其他dll地址发生冲突(由于windows程序是虚拟地址空间,exe一般不会有地址冲突,载入dll时可能会有地址冲突),就须要改动代码中的地址,如push 10001000。call 10002000等。

    这时就须要用进行基址重定位。而基址重定位表中存放了,假设默认地址被改。须要改动的代码的地址。在PE文件里。基址重定位表一般放在一个单独的 ".reloc" 区。能够通过IMAGE_OPTIONAL_HEADER 中 的DataDirectory[5] 查看 基址重定位表 的RVA。


    比如:


            用W32Dasm 查看 Demo.dll  (下载地址:http://pan.baidu.com/s/1qWDepo4)


    图片1



            能够发现MyMessageBox 这个函数,看看它的代码中的push 10006040 。 push 10006030 中的地址是指向字符串的。

    假设一个程序在载入Demo.dll时由于Demo.dll 默认的地址被占用了。而使用其他的基地址,比如使用20000000h作为基地址,Demo.dll就从20000000h開始装载。这样字符串“Demo”和“Hello World!” 就不是在10006040h跟10006030h中了,这时就须要把push 10006040 。 push 10006030改成push 20006040 , push 20006030 。



            基址重定位表是由一个一个IMAGE_BASE_RELOCATION结构  构成的。


    图片2



    IMAGE_BASE_RELOCATION 结构:


    typedef struct _IMAGE_BASE_RELOCATION {
        DWORD   VirtualAddress;
        DWORD   SizeOfBlock;
    //  WORD    TypeOffset[];
    } IMAGE_BASE_RELOCATION;
    typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

            当中 VirtualAddress  表示 这一组地址的起始RVA。

    SizeOfBlock表示当前这个IMAGE_BASE_RELOCATION 结构的大小。TypeOffset是一个数组,它的元素个数就是( SizeOfBlock - 8 ) / 2 ,TypeOffset 每个元素占用两个字节即16位。当中高4位表示重定位类型(一般都为3)。低12位表示重定位地址。



    实例分析:


            查看Demo.dll的第一个 IMAGE_BASE_RELOCATION 结构


    图片3



    能够发现:

    VirtualAddress  为1000h

    SizeOfBlock      为 0164h

    TypeOffset[0]   0333h  即 3是重定位类型  33h为重定位地址
    TypeOffset[1]   0338h

    TypeOffset[2]   0340h

         ........


    通过Type低12位+VirtualAddress 能够知道前三个的地址为1033h,1038h。1040h 。

    再来看看图片1中Demo.dll的代码,能够发现1033h就是图片1中的push 10006040中的10006040,1038h就是push 10006030中的10006030 。


        假设载入dll,发现不是使用默认的基地址,PE载入器就会把基址重定位表中所写的地址的值改掉。

    改掉方法是把原先的值加上 实际基地址 - 默认基地址 的值。





    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Spring Boot应用程序属性
    Spring Boot Bean和依赖注入
    Spring Boot构建系统
    Spring Boot Tomcat部署
    Spring Boot引导过程
    Spring Boot快速入门
    Spring Boot简介
    eclipse中将项目打包成jar的两种方法,及其问题与解决方法
    配置Zuul代理下游的认证
    WireMock和Spring MVC模拟器
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4653621.html
Copyright © 2011-2022 走看看