延迟加载Dll的实现原理
一. 简介
延迟加载Dll是一个混合方式,它通过LoadLirary和GetProcAddress获得延迟加载函数的地址,然后直接转向对延迟加载函数的调用。
延迟加载不是操作系统的一个特征,它完全是通过链接器和运行库加入额外的代码和数据来实现的。同样地,无法在WINNT.H里找到关于延迟加载的更多参考,不过,可以在延迟装入数据(Delayload Data)和常规的输入数据之间看到一定的相似之处。
Datadirectory数组中的IMAGE_DIRECTORY_ENTRY_IMPORT条目指向延迟加载的数据。这是一个指向ImgDelayDescr结构数组的RVA,这个结构定义在VisualC++的DelayImp.h中,表1.1说明了它的内容。每一个被延迟加载的Dll都对应一个ImgDelayDescr结构。
表1.1 ImgDelayDescr 结构
大小 | 成员 | 描述 |
DWORD | grAttrs | 这个结构的属性。目前唯一被定义的旗标是dlattrRva,表明这个结构中的字段应该被认为是RVA,而不是虚地址 |
RVA | rvaDLLName | 指向一个被输入的DLL的名称的RVA。这个字符串被传递给LoadLibrary |
RVA | rvaHmod | 指向一个HMODULE大小的内存位置的RVA。当延迟装入的DLL被装入内存后,它的模块句柄(hModule)被保存在这个地方 |
RVA | rvaIAT | 指向这个Dll的输入地址表的RVA,它与常规的IAT的格式相同 |
RVA | rvaINT | 指向这个DLL的输入名称表的RVA,它与常规的INT表格式相同 |
RVA | rvaBoundIAT | 可选的绑定IAT的RVA,指向这个DLL的输入地址表的绑定拷贝,它与常规的IAT表的格式相同,目前,这个IAT的拷贝并不是实际的绑定,但是这个特征可能会加到绑定程序的未来版本中 |
RVA |