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 < ...
随机推荐
- 浅析MyBatis(四):全自动写代码的MyBatis逆向工程
在前面几篇文章中,笔者介绍了 MyBatis 的运行流程,在此基础上简单介绍了手写 MyBatis 简易框架与自定义 MyBatis 插件的步骤,相信大家对于 MyBatis 框架的使用流程已经游刃有 ...
- 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...
- 用pyqt5做一个简易的音乐播放器
需求 要求可以读取音频文档,有播放和暂停的功能 附上代码(1)UI界面 # -*- coding: utf-8 -*- # Form implementation generated from rea ...
- Spring IOC 特性有哪些,不会读不懂源码!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 多线程.锁.JVM调优,都背出花啦,怎么一写代码还是乱糟糟? 为什么这些无论从书本. ...
- 连续函数离散化-以SOGI为例
0. 引言 0.1 本文内容 基于SOGI函数,将s域传递函数转换为离散的z域函数,并以m语言形式进行实现,在simulink中封装为m-function并进行验证 0.2 学到什么 离散化方法 函数 ...
- OGG-集成模式抽取与数据库参数streams_pool_size关系
一.学习目标 Oracle数据库,使用OGG集成模式抽取进程启动时,如果没有配置合理的streams_pool_size参数可能会过一段时间就报错abend! 那么我们如何配置这个参数的大小?如何计算 ...
- Java代码格式化规范实践总结
目标说明 统一良好的代码格式规范可以有效提升开发团队之间的「协作效率」,如果不同的开发团队或者开发人员采用不同的代码格式规范,那么每次Format代码都会导致大量的变化,在Code Review及Me ...
- 诸葛亮的锦囊妙计竟然是大名鼎鼎的Java设计模式:策略模式
目录 应用场景 简单实现例子 改进代码 策略模式 定义 意图 主要解决问题 何时使用 优缺点 诸葛亮的锦囊妙计 应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减 ...
- 微信小程序底部实现自定义动态Tabbar
多图警告!!! 最近在工作中遇到这样一个需求:微信小程序底部的Tab需要通过判断登录人的角色动态进行改变,想要实现这个功能依靠小程序原生的Tabbar是不可能实现的了,所以研究了一下自定义Tab,这里 ...
- 【cypress】3. 编写第一个测试
当环境安装好了之后,就可以着手尝试第一个测试的编写了. 一.新建一个文件 在你的项目下的cypress/integration文件夹中创建一个新文件sample_spec.js,我这里直接在webst ...