PE文件格式学习(十四):绑定导入表(BoundImportDirectory)

1.介绍

绑定导入表的作用是加快程序的启动速度,一个PE程序在启动时会去加载导入表中的dll文件,并将导入表的FirstThunk指向的数组填入函数的真实地址,这需要耗去时间,当绑定导入表有效时,即使是未运行状态,系统也会自动将导入表中的FirstThunk填入函数的真实地址,否则导入表的IAT在未载入内存时的值通常跟OriginFirstThunk中的一样,下图是Win7下的mspaint.exe,它拥有有效的绑定导入表,所以它的IAT中已经填好了函数的地址。
在这里插入图片描述

绑定导入表的生效,有两个前提条件:

  1. 程序初始化时,导入的DLL都加载到了首选基址中
  2. 程序执行了绑定导入操作以后,导入DLL中引用的符号位置一直没有变化

如果有任何一个条件没有满足,系统就会忽略绑定导入操作。

2.分析

在数据目录表中找到绑定导入表,本例使用的是Win7下的mspaint.exe,它的RVA是280h,大小为360,下图是它的十六进制数据:

我们对照它的结构体IMAGE_BOUND_IMPORT_DESCRIPTOR来分析:

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

TimeDateStamp:时间戳,不多作解释,对应上图的0x4a5bd97e

OffsetModuleName:偏移,基址是IMAGE_BOUND_IMPORT_DESCRIPTOR的开端,对应上图的0x00a0,0x280+0xa0就是dll名称的位置

NumberOfModuleForwarderRefs:后面IMAGE_BOUND_FORWARDER_REF结构的数量,对应上图的0x01

我们再来看看IMAGE_BOUND_FORWARDER_REF的结构体:

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

这个结构体的内容跟上面的其实是差不多的,绑定导入表中有一个函数转发链机制,比如说KERNEL32.DLL里面的HeapAlloc函数会转发到NTDLL.DLL中的RtlAllocateHeap函数,_IMAGE_BOUND_FORWARDER_REF 结构体就是用于保存转发函数的,一般情况下NumberOfModuleForwarderRefs为0,这个结构体对应上图中的0x288-0x28f处的内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值