PE文件中的输入表
前言
PE文件中的输入表含有三个重要结构IID,IDT,IAT。PE文件为需要加载的DLL文件创建一个IID结构,一个DLL与一个IID对应。IDT是输入名称表,IAT输入地址表,在没有绑定输入的情况下磁盘中的文件IDT与IAT相同。如果有绑定输入的话因为绑定输入的函数其磁盘文件中的IAT项就已经是对应函数的地址了,所以IDT与IAT就不同了。
函数隐式调用
我们一般在调用函数的时候都是直接用函数的名称,例如MessageBox()这种其在底层汇编指令上并不是直接调用MessageBox()函数的地址而是调用IAT中对应函数的地址(也就是函数的地址实际存放在IAT中)。一般在PE文件加载进入内存时,windows加载器会根据IDT(如果IDT为空就根据IAT)的函数信息在对应的DLL中查询实际函数的地址,然后重写到IAT中。也就是在加载到内存前IAT与IDT存储的都是输入函数的信息,并不包含函数的实际地址。只有当windows加载器将PE文件加载到内存后IAT中才会存放函数的实际地址,而我们实际调用函数的指令会指向这对应的IAT中函数的位置,完成函数的调用。这种方式称为函数隐式调用。
函数显式调用
如果我们调用函数的时候不直接使用函数名称,而是使用LoadLibrary()和GetProcAddress()函数在运行时动态获取函数的地址,这种函数调用根本不依赖于IAT,称为显示链接。
注意当我们自己的代码直接使用LoadLibrary()和GetProcAddress()函数时其汇编代码就是调用对应的函数地址。
函数绑定输入
对于函数隐式调用而言,因为需要在PE文件加载到内存时通过INT中的函数信息从DLL中获取函数的地址然后写到IAT中,这效率很低。如果我们能让PE文件在没加载到内存时就确定对应IAT中函数的地址的话就可以大大提高效率,这种就称为绑定输入函数。为了防止绑定输入的函数对应的dll发生改变造成函数调用出错,PE文件有对应的绑定输入表可以通过数据目录表访问,在PE文件加载到内存时windows加载器会依据绑定输入表中的信息与加载的dll的信息进行对比,如果发现不一致则会重新改写IAT。
延迟加载
延迟加载dll需要在链接器进行设置,这样会在数据目录表中的延迟加载表中形成对应的数据结构包含对应的IAT和IDT,此IAT和IDT与正常的IAT和IDT一样只不过此IAT不是windows加载器写入的。这样在第一次调用延迟加载的其中一个函数时运行库就会调用LoadLibrary()和GetProcAddress()写入此IAT,然后以后调用此函数都会来到此IAT处。
隐式,显式,绑定输入和延迟加载在HOOK中的使用
因为显式调用不依赖与IAT所以IAT_HOOK对其进行无效,而对于延迟加载的dll需要在其对应的延迟加载dll的IAT处HOOK。对于EAT_HOOK来说其只对后续加载的模块的HOOK有效果,因为如果是隐式调用,其在pe加载到内存时会根据EAT修改IAT,但是自此以后EAT对其就没用了。而后续加载的模块,例如显式调用和延迟加载其会利用EAT获取函数的地址,所以EAT_hook对二者有用.
区分动态/静态/运行时链接和显示/隐式调用
注意动态链接是指将对应Dll中的信息保存到PE文件的IID中,然后调用的函数信息存在IAT和IDT中。当PE文件加载到内存中时将IID对应的DLL加入到内存中进一步完成函数的调用。而静态链接是将函数对应的dll中的代码全部整合到PE文件中,这样函数的调用就不依赖于DLL也不会形成对应的IID。运行时链接是与函数的显示调用一起的,通过LoadLibrary()链接DLL,在通过GetProcAddress()获得API的地址显示调用函数。
PE文件中的输入表的更多相关文章
- PE文件 03 重定位表
0x01 重定位表结构 重定位表是由数据目录表中的第六个成员指出的: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; D ...
- 小甲鱼PE详解之输入表(导出表)详解(PE详解09)
小甲鱼PE详解之输出表(导出表)详解(PE详解09) 当PE 文件被执行的时候,Windows 加载器将文件装入内存并将导入表(Export Table) 登记的动态链接库(一般是DLL 格式)文件一 ...
- 小甲鱼PE详解之输入表(导入表)详解(PE详解07)
捷径并不是把弯路改直了,而是帮你把岔道堵上! 走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇! 岔路会将你引入万劫不复的深渊,并越走越深…… 在开始讲解输入 ...
- (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...
- 快速从mysqldump文件中恢复一个表
快速从较大的mysqldump文件中恢复一个表到数据库中: 1.先获取目标表(md_gas_check_record)在文件中的位置 [publish@LF-PRO-DB-01 ~]$ cat dby ...
- 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的
0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ...
- 小甲鱼PE详解之输入表(导入表)详解2(PE详解08)
在此之前,我们已经对这个输入表进行了一些实践和理解,这有助于大家对这个概念更进一步的加深认识.小甲鱼觉得,越是复杂的问题我们应该越是去动手操作它,认识它,这样才容易熟悉它! 在上一节课我们像小鹿一样的 ...
- 向PE文件中添加一个Section
背景 之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存 ...
- 向PE文件中空白处添加代码
// mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...
随机推荐
- 【JVM进阶之路】一:Java虚拟机概览
1.Java简史 Java语言是一门通用的.面向对象的.支持并发的程序语言.全球从事Java相关开发的人员已经数以百万计. 从1995年"Java"正式出现以来,Java已经经历了 ...
- 关于生产环境改用G1垃圾收集器的思考
背景 由于我们的业务量非常大,响应延迟要求高.目前沿用的老的ParNew+CMS已经不能支撑业务的需求.平均一台机器在1个月内有1次秒级别的stop the world.对系统来说是个巨大的隐患.所以 ...
- Java中的三大特性 - 超详细篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的三大特性 - 超详细篇>,希望对大家有帮助,谢谢 这一节的内容可能有点多,大家可以选择性的来看 简介 Java的三大特性:封装.继 ...
- 简单创建ASP.NET网站(1)
闲话 公司员工辞职了,我从原来的Delphi开发转型到ASP.NET开发,接受同时的相关工作,因为网上搜了视频学习,还是不觉得有什么提升,一脸懵逼,所以就买了书籍自己慢慢学习,为了加深记忆,我就记录一 ...
- 一文彻底掌握Apache Hudi的主键和分区配置
1. 介绍 Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由记录键和记录所属的分区路径组成.基于此设计Hudi可以将更新和删除快速应用于指定记录.Hudi使用分区路径字段对数据 ...
- ISP算法:深入聊聊lens shading
一.简介 关于什么是成像中的lens shading这里直接引用一句英文的definition:"The term shading describes the light fall-off ...
- windows利器使用与配置
1 概述 这篇文章主要讲述了一些windows下的"利器"级别工具的使用以及配置. 2 Listary Listary是一款强大的搜索工具,可以快速搜索过滤各种文件. 点击这里下载 ...
- Symmetry UVA - 1595
The figure shown on the left is left-right symmetric as it is possible to fold the sheet of paper ...
- JAVAEE_Servlet_18_关于Servlet线程安全问题
关于Servlet线程安全问题 Servlet线程安全 Servlet 是单实例多线程的环境下运行的. 在服务器运行期间,一个Servlet接口实现类,只能创建一个实例对象(一个进程(Servlet接 ...
- Day07_33_链表
链表 单链表 双向链表 * 什么是双向链表? 双向链表是链表的一种,由节点组成,每个数据结点中都有两个指针,分别指向直接后继和直接前驱. ![](https://img2020.cnblogs.com ...