by evil.eagle 转载请注明出处。
http://blog.csdn.net/evileagle/article/details/12718845
PE文件结构详解(四)PE导入表讲了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import)。看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因为有些导入函数可能使用的频率比较低,或者在某些特定的场合才会用到,而有些函数可能要在程序运行一段时间后才会用到,这些函数可以等到他实际使用的时候再去加载对应的DLL,而没必要再程序一装载就初始化好。
这个机制听起来很诱人,因为他可以加快启动速度,我们应该如何利用这项机制呢?VC有一个选项,可以让我们很方便的使用到这项特性,如下图所示:
在这一项后面填写需要延迟导入的DLL名称,连接器就会自动帮我们将这些DLL的导入变为延迟导入。
现在我们知道如何使用延迟导入了,那这个看上去很厉害的机制是如何实现的呢?接下来我们来探索一番。在IMAGE_DATA_DIRECTORY中,有一项为IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,这一项便延迟导入表,IMAGE_DATA_DIRECTORY.VirtualAddress就指向延迟导入表的起始地址。既然是表,肯定又是一个数组,每一项都是一个ImgDelayDescr结构体,和导入表一样,每一项都代表一个导入的DLL,来看看定义