卸载西部数码网站管理助手,网络营销的基本特征有哪些,wordpress可注册地址,网站建设怎么管理业务员我们在分析Windows自带的一些程序时#xff0c;常常发现有的程序#xff0c;如notepad#xff0c;他的IAT表在文件加载内存前已经完成绑定#xff0c;存储了函数的地址。这样做可以使得程序是无需修改IAT表而直接启动#xff0c;这时程序启动速度变快。但这种方式只适用于…我们在分析Windows自带的一些程序时常常发现有的程序如notepad他的IAT表在文件加载内存前已经完成绑定存储了函数的地址。这样做可以使得程序是无需修改IAT表而直接启动这时程序启动速度变快。但这种方式只适用于dll按照预先设定ImageBase装载而不重分配的情况
当dll没有按照预先设定的ImageBase进行装载IAT表在文件加载内存前进行绑定就会出现问题了
为了判断一个程序的IAT是否在加载内存前就已经进行了绑定PE的导入表中提供了TimeDateStamp时间戳成员变量当该值为0时表示该导入表对应的IAT表在加载内存前尚未绑定。当该值为-1时表示该导入表对应的IAT表加载内存前已经绑定。而真正绑定的时间存储在绑定导入表中
绑定导入表
绑定导入表用于存储已经绑定即完成绑定导入的外部函数的信息。一个绑定导入表对应一个dll通常存在于Windows操作系统自带的程序中但在win10以后操作系统中其自带的程序已经很少有绑定导入表了逐渐被弃用
定位
通过数据目录的第12个结构我们便可以定位到绑定导入表地址 当有绑定导入表时其起始地址是在节表后面因此在新增节的时候节表后面的数据不建议更改
结构
绑定导入表的结构如下
struct _IMAGE_BOUND_IMPORT_DESCRIPTOR{ DWORD TimeDateStamp; WORD OffsetModuleName; WORD NumberOfModuleForwarderRefs;
};
DWORD TimeDateStamp时间戳表示IAT表绑定的真正时间
操作系统通过程序使用到的DLL对应的绑定导入表结构中TimeDateStamp和该DLL的可选PE头中的TimeDateStamp进行对比判断dll在绑定IAT表以后是否发生修改
如果两个时间戳一样DLL的创建时间和把DLL中的函数绝对地址绑定到IAT表的时间是一样表明在绑定IAT表以后DLL没有更新或者修改。
如果两个时间戳不一样DLL在创建以后被更新或者修改了此时绑定到IAT表中的函数地址可能出现错误。这是由于DLL中的函数地址可能变了但绑定到IAT中的数据可能是以前的函数地址
WORD OffsetModuleName该值加上所有绑定导入表中的第一个绑定导入表的RVA表示该绑定导入表对应的DLL的名称的RVA
WORD NumberOfModuleForwarderRefs一个dll可能依赖于其他的dll该值表示该dll依赖的其他的dll的数量。有多少dll绑定导入表后就紧跟着多少_IMAGE_BOUND_FORWARDER_REF结构
_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表示绑定导入表结束