当前位置: 首页 > news >正文

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对应的绑定导入表结构中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,表示绑定导入表结束    


文章转载自:
http://bemean.wkuuf.cn
http://baddish.wkuuf.cn
http://calculative.wkuuf.cn
http://camphene.wkuuf.cn
http://cholecystostomy.wkuuf.cn
http://addie.wkuuf.cn
http://australorp.wkuuf.cn
http://centurion.wkuuf.cn
http://aviatrix.wkuuf.cn
http://brussels.wkuuf.cn
http://assaultiveness.wkuuf.cn
http://bivalvular.wkuuf.cn
http://actuality.wkuuf.cn
http://beadledom.wkuuf.cn
http://cg.wkuuf.cn
http://cellularity.wkuuf.cn
http://broadish.wkuuf.cn
http://biocidal.wkuuf.cn
http://adjoining.wkuuf.cn
http://alcor.wkuuf.cn
http://amerika.wkuuf.cn
http://acknowledgedly.wkuuf.cn
http://botulinus.wkuuf.cn
http://bitten.wkuuf.cn
http://basehearted.wkuuf.cn
http://bacilus.wkuuf.cn
http://astyanax.wkuuf.cn
http://ascetic.wkuuf.cn
http://cholate.wkuuf.cn
http://badinage.wkuuf.cn
http://www.dtcms.com/a/133513.html

相关文章:

  • 【论文阅读】MOE奠基论文《Adaptive Mixtures of Local Experts》
  • C++基础精讲-07
  • TCPIP详解 卷1协议 五 Internet协议
  • Java 企业级应用:SOA 与微服务的对比与选择
  • SpringBoot-切换用户列表并显示用户信息
  • HarmonyOS应用开发的工程目录结构
  • Android Studio 实现自定义全局悬浮按钮
  • WebSocket与MQTT
  • 【HDFS入门】HDFS核心组件Secondary NameNode角色职责与运行机制解析
  • 【MySQL高级】事务,存储引擎,索引(一)
  • 2024年蓝桥杯第十五届CC++大学B组真题及代码
  • 罗庚机器人:机器人打磨领域的先行者
  • 基于Windows通过nginx代理访问Oracle数据库
  • 深入理解 PyTorch:从入门到精通的深度学习框架
  • 基于Oracle ADG通过dblink创建物化视图同步数据到目标库
  • spark-sql学习内容总结
  • Coze流搭建--写入飞书多维表格
  • DHCP简单例子
  • 旧版 VMware 虚拟机迁移至 KVM 平台-案例1
  • ThreeJs实现裸眼3D地球仪
  • 源代码加密之零日攻击
  • 算力云平台部署—SadTalker的AI数字人视频
  • java 递归遍历JSON字符串获取某个字段的值
  • Docker构建go-web应用
  • 视频孪生技术赋能矿山数字化升级转化
  • 【ROS2】行为树 BehaviorTree(四):组合使用子树
  • Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程
  • 利用DevEco Profiler定位性能瓶颈,优化资源占用
  • C++性能优化实战:从瓶颈定位到高并发架构重构(第一章)
  • AI大模型赋能工业制造:智能工厂的全新跃迁路径