PE体系

PE结构&整体叙述

PE结构&导入表

PE结构&导出表

PE结构&基址重定位表

PE结构&绑定导入实现

PE结构&延迟加载导入表

简介

作用

绑定导入是一种提高PE加载速度的技术。它只能起辅助性作用,它的存在与否只影响加载过程,并不影响PE的最终加载结果和运行结果

为什么说是辅助性呢?
因为不同的操作系统中,动态链接库的基地址是不一样的。举个例子,kernel32.dll,在Windows 2000中其加载到进程空间的基地址为0x77e60000,而在Windows XP SP3中其加载地址则是0x7c800000。同一动态链接库加载后处于不同的基地址,直接导致了同一个导入函数在不同操作系统中其导入地址VA是不一样的。

因此经过绑定的PE程序可以能在Windows 2000里运行得很好,但是到了Windows XP SP3中却因地址出现错误而造成无法运行。

解决办法

在为PE加入绑定导入机制的时候,微软就已经考虑了这个问题,所以假定PE加载前对IAT的修正都是正确的。那么PE的加载速度是加快的,即使绑定以后的EXE程序在其他兼容系统中运行时,其地址出现错误,PE加载也有检测错误的基址。如果地址检测出错误,PE加载器会重新接管这项工作,加载时对IAT进行修正。

原因

双桥结构导入表中,桥2是指向IAT的,Windows加载程序负责IAT中地址的修正工作。如果导入函数比较多的话,那么就会占用比较长的时间,从而加载速度就会变慢。因此有了绑定导入,它的目的就是把Windows加载程序负责的IAT地址修正工作提到加载前进行,要么由用户手工完成,要么由专门的程序完成;然后再PE文件中声明导入数据,以便告诉操作系统加载器说这部分工作不需要你做了。

操作

微软提供了一个绑定工具bind.exe程序,它把导入表IAT表项IMAGE_THUNK_DATA32的内容都静态替换成虚拟内存地址(如下图)


,然后在数据目录表的第12项指定的位置声明这些更改。Windows在加载目标PE相关的动态链接库时,会检查这些地址时候合法(检查操作包括:当前的DLL版本是否符合绑定导入结构中描述的版本号,如果不符合或者DLL需要被重新定位加载器也就会去遍历INT(如下图),计算新的地址。)

这就是为什么双桥可以绑定, 单桥不能绑定了,因为单桥的话,进行遍历INT这里是无效的(没有桥1,只有桥2),所以单桥结构无法实施静态绑定

绑定导入数据定位

绑定导入数据结构

IMAGE_BOUND_IMPORT_DESCRIPTOR    STRUCTTimeDataStamp                 dword       ?   ;   0000h   -时间戳OffserModuleName                word        ?   ;   0004h   -指向DLL名称NumberOfModuleForwarderRefs     word        ?   ;   0006h   -ModuleForwarderRef 数目
IMAGE_BOUND_IMPORT_DESCRIPTOR   ENDS

IMAGE_BOUND_IMPORT_DESCRIPTOR.TimeDataStamp

+0000h,双字。该字段的值必须要与要引用的DLL文件头IMAGE_FILE_HEADER.TimeDataStamp字段值相吻合,否则就会促使加载器去重新计算新IAT,这种情况一般发生在DLL版本不同时或者DLL映像被重定位时

IMAGE_BOUND_IMPORT_DESCRIPTOR.OffserModuleName

+0004h,单字。该字段包含了以第一个IMAGE_BOUND_INPORT_DESCRIPTOR作为基址,DLL名称字符串(ASCII且以“\0”结束)的偏移

注意:
该偏移地址是一个特殊的地址,它即不是RVA,也不是FOA

IMAGE_BOUND_IMPORT_DESCRIPTOR.NumberOfModuleForwarderRefs

+0006h,单字。该字段描述了紧接在IMAGE_BOUND_IMPORT_DESCRIPTOR结构后的另一个结构IMAGE_BOUND_FORWARDER_REF的定义:

IMAGE_BOUND_FORWARDER_REF STRUCTTimeDataStamp        dword       ?; 0000h        -   时间戳OffsetModuleName word        ?; 0004h        -   指向DLL名称Reserved         word        ?; 0006h        -   预留
IMAGE_BOUND_FORWARDER_REF ENDS

为什么会存在该结构呢?处于不同的目的(如代码更新,结构调整或实施补丁等),动态链接库中的某些函数的实现代码会被转移到别的动态链接库中。但为了提供向前的兼容,这些动态链接库中还保留该函数的定义。

换种说法,一个导入函数将涉及对多个动态链接库函数的调用,数据结构IMAGE_BOUND_FORWARDER_REF就是在这样一个背景下产生的,它将引入函数涉及的所有动态链接库都列举出来。

该结构的字段定义和IMAGE_BOUND_IMPORT_DESCRIPTOR是基本一致的,所以前面的描述“绑定导入数据由一系列的绑定导入描述符IMAGE_BOUND_IMPORT_DESCRIPTOR的结构组成”也是成立。

导入数据组织方式如下图:

实际操作

用的是dump后的文件:

注意:
系统文件的绑定导入表数据在文件中的存放位置:大部分情况下,该数据被存在PE文件头部,紧跟在节表后。

看一个特殊的具有IMAGE_BOUND_FORWARDER_REF的结构,如上图数据进行分析,分析结果如下:
IMAGE_BOUND_IMPORT_DESCRIPTOR。

C6   BD  02  48

绑定时操作系统中动态链接库kernel32.dll 的时间戳

A3   00

指向动态链接库名称字符串的偏移为0x00A3,注意该偏移是基于第一个IMAGE_BOUND_IMPORT_DESCRIPTOR结构的,即基于文件偏移地址0x00000250开始的偏移。

01   00

表示该动态链接库中的函数实现字节码存储在另一个动态链接库中

B0   00

指向动态链接库名称字符串的偏移

00   00

预留值,为0

PE结构绑定导入实现相关推荐

  1. PE结构延迟加载导入表

    PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 简介 延迟加 ...

  2. PE结构基址重定位表

    PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...

  3. PE文件学习笔记(五):导入表、IAT、绑定导入表解析

    1.导入表(Import Descriptor)结构解析: 导入表是记录PE文件中用到的动态连接库的集合,一个dll库在导入表中占用一个元素信息的位置,这个元素描述了该导入dll的具体信息.如dll的 ...

  4. windows PE结构解析

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是"虚拟地址"而不是"物理地址".为什么不是"物理地址"呢?因为数据在内 ...

  5. 【EXE PE】了解pe段--PE结构详解

    来源:看雪论坛http://bbs.pediy.com/showthread.php?t=145912 1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是"虚拟地址&qu ...

  6. PE结构详解(64位和32位的差别)

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是"虚拟地址"而不是"物理地址".为什么不是"物理地址"呢?因为数据在内 ...

  7. 21. PE结构-PE各个结构的基本概念

    exe与dll几乎没什么区别,唯一区别就是一个字段标识出这个文件是exe还是dll 32位叫PE32,64位叫PE32+ PE主要定义在winnt.h vc搜索:image format,定义PE结构 ...

  8. 【逆向工程】在PE结构空白区段插入代码

    最近在学PE结构,遇到了个比较有意思的实验,学过PE结构的都知道因为文件对齐FileAlignment和区块对齐SectionAlignment的缘故,在磁盘中的PE文件的块与块表 块与块之间有许多的 ...

  9. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

最新文章

  1. 如何使用ModelSim作前仿真與後仿真? (真oo无双前辈)
  2. libsybcomn64.dll php,libsybcomn.dll下载|
  3. leetcode 8. 字符串转换整数 (atoi)
  4. selenium 状态码521_sqlmap对状态码404处理的bug
  5. .NET 开源项目 Anet 介绍
  6. spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
  7. DBUtils的概述
  8. (宏)Word 纯文本粘贴
  9. 如何在 Apple TV 上获得电影推荐?
  10. 英特尔、高通等禁止员工与华为私下交流
  11. 回归分析常数项t值没有显著异于零怎么办_洋蜜蜂统计辅导专题:回归分析关键词统计量须知...
  12. Zalo电脑版多开软件
  13. linux i3 桌面,Linux 桌面平铺管理器 - i3wm
  14. 远程桌面管理工具源码
  15. 【论文阅读】Probabilistic Embeddings for Cross-Modal Retrieval CVPR 2021 --- 跨模态检索,概率嵌入,一对多,多对多匹配
  16. 申请苹果个人开发者经历
  17. 中移物联网入门记录(1)
  18. java工程师面试题大全100%公司笔试题你都能碰到几个
  19. 专升本笔记记载-第七章-无穷级数
  20. 数字图像处理——拉普拉斯算子【像素级别处理】(python)

热门文章

  1. 成功解决If your current network has https://www.anaconda.com blocked, please filea support request with
  2. TF之DNN:TF利用简单7个神经元的三层全连接神经网络【2-3-2】实现降低损失到0.000以下
  3. ML之NB:利用NB朴素贝叶斯算法(CountVectorizer/TfidfVectorizer+去除停用词)进行分类预测、评估
  4. 发现你的身形——OpenCV图像轮廓
  5. Javacript Remove Elements from Array
  6. bzoj3714:[PA2014]Kuglarz
  7. angularJs基础学习
  8. Word中更新交叉引用
  9. java 对象 输出
  10. 关于C#资源文件操作的总结