首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

PE文件结构详解(5)延迟导入表

2013-10-15 
PE文件结构详解(五)延迟导入表by evil.eagle 转载请注明出处。http://blog.csdn.net/evileagle/article/det

PE文件结构详解(五)延迟导入表

by evil.eagle 转载请注明出处。

http://blog.csdn.net/evileagle/article/details/12718845


  PE文件结构详解(四)PE导入表讲了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import)。看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因为有些导入函数可能使用的频率比较低,或者在某些特定的场合才会用到,而有些函数可能要在程序运行一段时间后才会用到,这些函数可以等到他实际使用的时候再去加载对应的DLL,而没必要再程序一装载就初始化好。

这个机制听起来很诱人,因为他可以加快启动速度,我们应该如何利用这项机制呢?VC有一个选项,可以让我们很方便的使用到这项特性,如下图所示:

PE文件结构详解(5)延迟导入表


在这一项后面填写需要延迟导入的DLL名称,连接器就会自动帮我们将这些DLL的导入变为延迟导入。

现在我们知道如何使用延迟导入了,那这个看上去很厉害的机制是如何实现的呢?接下来我们来探索一番。在IMAGE_DATA_DIRECTORY中,有一项为IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,这一项便延迟导入表,IMAGE_DATA_DIRECTORY.VirtualAddress就指向延迟导入表的起始地址。既然是表,肯定又是一个数组,每一项都是一个ImgDelayDescr结构体,和导入表一样,每一项都代表一个导入的DLL,来看看定义:


最后还有两点要提醒大家:

延迟导入的加载只发生在函数第一次被调用的时候,之后IAT就填充为正确函数地址,不会再走__delayLoadHelper了。

延迟导入一次只会导入一个函数,而不是一次导入整个模块的所有函数。




热点排行