PE文件:绑定导入表

0x00 作用

绑定导入表是为了加快程序的加载程序,因为正常PE加载的时候,要去检查导入表并将相关的DLL映射到进程空间地址,并将导入表的FirstThunk指向的数组填入函数的真实地址,这一步需要花费很多时间,绑定导入表就是为了解决此环节的问题,绑定导入表中保存了导入函数的真实地址,PE加载的时候系统会检测是否有绑定导入表,就会直接将函数地址写入FirstThunk。
但是绑定导入表的生效,有两个前提条件:
1.程序初始化时,导入的DLL都加载到了首选基址中
2.程序执行了绑定导入操作以后,导入DLL中引用的符号位置一直没有变化

俩个条件有一个不符合的话,就不可以绑定,

0x01 结构

数据目录表( DataDirectory )的第12个成员
它包含了可以让加载器判断绑定的地址是否合法的信息。描述它的数据结构是IMAGE_BOUND_IMPORT_DESCRIPTOR,目录表就是这种结构的数组,每一项都对应一个被绑定过的DLL。

typedef	    struct _IMAGE_BOUND_IMPORT_DESCRIPTOR { 
		DWORD TimeDateStamp; 
		WORD OffsetModuleName;
 		WORD NumberOfModuleForwarderRefs; 
		} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

结构成员:

OffsetModuleName:偏移,指向dll名称,基址是IMAGE_BOUND_IMPORT_DESCRIPTOR的开端,对应上图的0x00a0,0x280+0xa0就是dll名称的位置
NumberOfModuleForwarderRefs。是紧接着本结构后的另一个IMAGE_BOUND_FORWARDER_REF结构数组的元素个数。

 typedef struct _IMAGE_BOUND_FORWARDER_REF {
	DWORD TimeDateStamp;
	WORD OffsetModuleName;
	WORD Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;

这个结构数组干什么用的?
某些情况下,动态链接库中的某些函数的实现代码会被转移到别的动态链接库中。(一个导入函数将涉及多个动态链接库函数的调用)。这个结构将所有涉及的动态链接库都列举出来。
这里的IMAGE_BOUND_FORWARDER_REF结构就是用来记录接受转发的另一个DLL的校验信息,如果这个DLL还有导出转发,那么在该DLL中也有IMAGE_BOUND_FORWARDER_REF结构描述第三个DLL的校验信息。
在这里插入图片描述
此数据项两个作用:
1、根据TimeDateStamp和OffsetModuleName字段的值我们就可以判断IAT表中的信息是否已经过期。
2、解决DLL转发问题

发布了19 篇原创文章 · 获赞 21 · 访问量 985

猜你喜欢

转载自blog.csdn.net/weixin_43742894/article/details/105252663
今日推荐