抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

移动重定位表

Relocation(重定位)是一种将程序中的一些地址修正为运行时可用的实际地址的机制。在程序编译过程中,由于程序中使用了各种全局变量和函数,这些变量和函数的地址还没有确定,因此它们的地址只能暂时使用一个相对地址。当程序被加载到内存中运行时,这些相对地址需要被修正为实际的绝对地址,这个过程就是重定位;

在Windows操作系统中,程序被加载到内存中运行时,需要将程序中的各种内存地址进行重定位,以使程序能够正确地运行。Windows系统使用PE(Portable Executable)文件格式来存储可执行程序,其中包括重定位信息。当程序被加载到内存中时,系统会解析这些重定位信息,并将程序中的各种内存地址进行重定位;

重定位表一般出现在DLL中,因为DLL都是动态加载,所以地址不固定,DLL的入口点在整个执行过程中至少要执行2次,一次是在开始时执行初始化工作,一次则是在结束时做最后的收尾工作,重定位表则是解决DLL的地址问题;

为什么要移动导出表

  1. 导出表由编译器生成, 导出表中存储了该PE文件有哪些导出函数以及函数的地址;
  2. 在程序启动时, 系统会根据导出表做初始工作; 将用到的Dll中的函数地址存储到IAT表中;
  3. 为了保护程序, 可以对.EXE的二进制代码进行加密操作;
    • 如果进行加密, 各种表的信息以及数据是混在一起的, 加密后会导致程序无法正常执行;
    • 因此需要新增一个节, 并将PE中的表移动到新节中, 然后将代码和数据进行加密;

内存直接加载运行

  • 病毒木马具有模拟PE加载器的功能, 它们可以把DLL或者exe等PE文件从内存中直接加载到病毒木马的内存中去执行, 不需要通过LoadLibrary等现成的API函数去操作;
  • 假如程序需要动态调用DLL文件, 内存加载运行技术可以把DLL作为资源插入到自己的程序中, 此时可直接在内存中加载运行即可;
  • 内存加载技术的核心就在于模拟PE加载器PE文件, 也就是对导入表、导出表、重定位表的操作过程;

基础知识

  • 基地址(ImageBase): 当PE文件通过Windows加载器载入内存后,内存中的版本称为模块,映射文件的起始地址称为模块句柄,可通过句柄访问内存中其他数据结构,这个内存起始地址称为基地址。
  • 虚拟地址(VA): 在Windows系统中,PE文件被系统加载到内存后,每个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址。
  • 相对虚拟地址(RVA): 可执行文件中,有许多地方需要指定内存中的地址。例如,应用全局变量时需要指定它的地址。为了避免在PE文件中出现绝对内存地址引入了相对虚拟地址,它就是在内存中相对于PE文件载入地址的偏移量。
  • 文件偏移地址(FOA): 当PE文件存储在磁盘中时,某个数据的位置相对于文件头的偏移量称为文件偏移地址(FOA)。文件偏移地址从PE文件中的第一个字节开始计数,起始值为0。

它们之间的关系:虚拟地址(VA) = 基地址(ImageBase) + 相对虚拟地址(RVA)

Windows PE

  • 可执行文件(Executable file)指的是可以由操作系统进行加载执行的文件
  • 可执行文件的格式:
    • Windows 平台
      PE(Portable Executable)文件结构
    • Linux 平台
      ELF(Executable and Linking Format)文件结构