PE文件(十五)绑定导入表

我们在分析Windows自带的一些程序时,常常发现有的程序,如notepad,他的IAT表在文件加载内存前已经完成绑定,存储了函数的地址。这样做可以使得程序是无需修改IAT表而直接启动,这时程序启动速度变快。但这种方式只适用于dll按照预先设定ImageBase装载而不重分配的情况

当dll没有按照预先设定的ImageBase进行装载,IAT表在文件加载内存前进行绑定就会出现问题了

为了判断一个程序的IAT是否在加载内存前就已经进行了绑定,PE的导入表中提供了TimeDateStamp时间戳成员变量:当该值为0时,表示该导入表对应的IAT表在加载内存前尚未绑定。当该值为-1时,表示该导入表对应的IAT表加载内存前已经绑定。而真正绑定的时间存储在绑定导入表中

绑定导入表

绑定导入表:用于存储已经绑定(即完成绑定导入)的外部函数的信息,一个绑定导入表对应一个dll。绑定导入表通常存在于Windows操作系统自带的程序中,但在win10以后操作系统中,其自带的程序已经很少有绑定导入表了,逐渐被弃用

定位

通过数据目录的第12个结构我们便可以定位到绑定导入表地址:

201545

结构

绑定导入表的结构如下:

struct _IMAGE_BOUND_IMPORT_DESCRIPTOR{						
    DWORD TimeDateStamp; 			
    WORD OffsetModuleName;	
    WORD NumberOfModuleForwarderRefs;  		
};  

DWORD TimeDateStamp:时间戳,表示IAT表完成绑定的真正时间

操作系统通过对比该值与对应DLL的可选PE头中的TimeDateStamp,判断DLL在绑定后是否被修改:

若两者一致:说明DLL自绑定后未被更新或修改,IAT表中记录的函数地址有效。

若两者不一致:说明 DLL 在绑定后被修改过,此时绑定到IAT表中的函数地址可能被修改,导致绑定的函数地址失效

WORD OffsetModuleName:该值加上第一个绑定导入表的RVA可得到当前绑定导入表所对应 DLL 的名称的RVA

WORD NumberOfModuleForwarderRefs:表示当前DLL所依赖的其他DLL的数量。每个依赖的DLL对应一个_IMAGE_BOUND_FORWARDER_REF结构,这些结构紧随当前_IMAGE_BOUND_IMPORT_DESCRIPTOR之后。

_IMAGE_BOUND_FORWARDER_REF结构如下:

struct _IMAGE_BOUND_FORWARDER_REF {			
    DWORD TimeDateStamp;  //时间戳		
    WORD OffsetModuleName;  //对应DLL的名字
    WORD Reserved;  //保留(未使用)	
};

TimeDataStamp:和绑定导入表结构中的TimeDateStamp含义和用途是一样的

OffsetModuleName:和绑定导入表结构中的OffsetModuleName含义和用途是一样的

Reserved:保留字段(未使用),没有任何含义

绑定导入表的文件分布如下:

当有sizeof(_IMAGE_BOUND_IMPORT_DESCRIPTOR)个0,表示绑定导入表结束    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值