• WindowsPE权威指南-PE文件头中的重定位表


    PE加载的过程

    任何一个EXE程序会被分配4GB的内存空间,用户层处理低2G的内存,驱动处理高2G的内存。

    • 1、双击EXE程序,操作系统开辟一个4GB的空间。
    • 2、从ImageBase决定了加载后的基址,ImageSize决定了程序有多大。
    • 3、然后加载DLL

    大体流程:

    1、PE被执行时,装载器为进程分配虚拟地址空间,在此情况下,并不是把完整的PE文件载入到磁盘中,而是做一个简单的内存映射。
    
    2、PE装载器在内核中创建进程对象和主进程对象以及其他的内容。
    
    3、PE装载器搜索输入表,装载应用程序所用的动态链接库,方式类似于应用程序的装载。
    
    4、PE装载器执行PE文件首部所指定地址的代码,开始执行应用程序。
    

    PE文件头中的重定位表

    程序被装入内存时,其基址是由字段IMAGE_OPTIONAL_HEADER32.ImageBase决定的。如果当装载时该位置已经被别的程序使用,那么操作系统就有权重新选择一个基地址。这个时候就需要对所有的重定位信息进行修正,而修正的依据就是PE的重定位表。

    重定位表结构

    重定位表为数据目录中注册的数据类型之一,其描述信息处于数据目录的第6个目录项中。

    typedef struct _IMAGE_BASE_RELOCATION {
        DWORD   VirtualAddress;    // 页存储的起始RVA
        DWORD   SizeOfBlock;      // 重定位块的长度
    } IMAGE_BASE_RELOCATION;
    typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
    

    参考

    滴水逆向第三期重定位

    https://ke.qq.com/webcourse/index.html#cid=160243&term_id=100184967&taid=869859726619123&type=1024&vid=m14134ekj6e

  • 相关阅读:
    C陷阱与缺陷学习笔记
    C陷阱与缺陷学习笔记
    Linux Socket编程(不限Linux)
    Linux Socket编程(不限Linux)
    Windows API 教程(九) 网络编程
    Windows API 教程(九) 网络编程
    sockaddr与sockaddr_in的关系
    winsocket入门学习
    09-C语言数组
    08-C语言循环
  • 原文地址:https://www.cnblogs.com/17bdw/p/10403959.html
Copyright © 2020-2023  润新知