延迟加载Dll的实现原理

延迟加载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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值