1.介绍
延迟加载表本质上跟绑定导入表的目的是一样的,都是为了加快程序加载文件的速度,只不过方法不一样。
延迟加载是指在调用某个DLL时才去加载,目的是为了避免在程序启动之初就加载了不必要的DLL而浪费了时间。微软建议在两种情况下使用延迟加载:
- 程序并非在启动时就会调用DLL里面的函数
- 程序未必会调用该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