PE文件格式学习(十六):延迟加载表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tutucoo/article/details/83855785

1.介绍

延迟加载表本质上跟绑定导入表的目的是一样的,都是为了加快程序加载文件的速度,只不过方法不一样。
延迟加载是指在调用某个DLL时才去加载,目的是为了避免在程序启动之初就加载了不必要的DLL而浪费了时间。微软建议在两种情况下使用延迟加载:

  1. 程序并非在启动时就会调用DLL里面的函数
  2. 程序未必会调用该DLL里面的函数

延迟加载表不是系统支持的一个特性,它是由编译器控制的。

2.分析

我们还是使用之前使用过的程序:Win7下的mspaint.exe。这个程序的延迟加载表的RVA是85ccch,转换成offset是850cch:

它的结构体是:

typedef struct ImgDelayDescr {  
    DWORD        grAttrs;       
    RVA          rvaDLLName;     
    RVA          rvaHmod;       
    RVA          rvaIAT;       
    RVA          rvaINT;      
    RVA          rvaBoundIAT;  
    RVA          rvaUnloadIAT; 
    DWORD        dwTimeStamp;   
    } ImgDelayDescr, * PImgDelayDescr;  

grAttrs:延迟导入结构的属性,0x1为新版本,0x0为老版本,对应上图中的0x00000001

rvaDLLName:dll名字的RVA,对应上图的0x85d40,转为offset是0x85140,下图是对应的dll名

rvaHmod:dll句柄的RVA,对应上图的0x8bd78

rvaIAT:IAT表的RVA,对应上图的0x8a000

rvaINT:INT表的RVA,对应上图的0x85d4c

rvaBoundIAT:绑定导入表的RVA,对应上图的0

rvaUnloadIAT:原始IAT的可选拷贝的RVA,对应上图的0

dwTimeStamp:延迟载入DLL的时间戳,通常为0

猜你喜欢

转载自blog.csdn.net/tutucoo/article/details/83855785