PE格式第四讲,数据目录表之导入表,以及IAT表
PE格式第四讲,数据目录表之导入表,以及IAT表
作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)
一丶IAT(地址表)
首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE
那么他到底是怎么去调用的?
他会Call 下边的Jmp位置
而Jmp位置则是对一个全局变量取内容.
看下全局变量内容是什么.
我们跟过去看下 75 98 FD AE
可以看出,这个位置保存了一张表格,这张表格保存的是MessageBoxA的函数地址.
那么我们想一下,在程序还没加载之前.这张表格是否存在,内容是否是这个.
利用虚拟地址,转文件地址,定位 虚拟地址502008
利用快捷方式转化
FA = VA - 节区表首地址 + pointerToRawData的大小
节区表在内存中查看
得出节区表的首地址为502000 因为我们的虚拟地址大于502000,所以他属于是.rdata区.
看下PE格式,文件中.radata的字段.
得出400
公式:
FA = VA - 节区表首地址 + pointerToRawData的大小
= 502008 - 502000 + 400
= 8 + 400
= 408 (文件偏移处)
看下文件偏移处
可以看出,205C是一个RVA偏移,转为FA跟随则是
FA = 5c + 400 = 45c位置
45C位置
正好是MsgBosA的字符串
这个IAT表格会跟你的函数个数,会预留很多个
加载到内存的时候,则会写入到这里.
我们改成FFFFF试试.
发现还是可以正常运行的.
而这个表格的存储方式则是
/*IAT [iat1......0 iat2........0]*/
其中是以0结尾的.
二丶导入表
了解什么是导入表
上面我们说过,程序调用API,那么导入表就是保存这些API的信息
首先我们猜测一下
1.应该有函数名,因为根据函数名才可以在DLL中使用(当然也可以是序号,但是不兼容)
2.猜测应该有DLL名称,要根据这个DLL才可以加载这个函数名
3.猜测应该会有存放IAT表格的RVA地址, 加载DLL了,根据函数名获得了函数地址,程序启动之后就会往IAT表格中填写地址了.
等等.
看下结构体:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {union {DWORD Characteristics; DWORD OriginalFirstThunk; //指向上面的IAT,是一个结构数组,里面保存了导入函数的信息(例如Msg的实际地址) }; //最后会以全0的结构为结束,其中每一项是一个结构,一项8个字节,是指向 //IMAGE_THUNK_DATA 看下面详解 DWORD TimeDateStamp; //时间,一般不用 DWORD ForwarderChain; //链表前一个结构,一般不用 DWORD Name; //上面说的DLL名称的RVA偏移通过偏移可以找到DLL名称DWORD FirstThunk; // IAT 的RVA偏移.和originalFirstThunk不同 } IMAGE_IMPORT_DESCRIPTOR;
看图:
按照第一个偏移结构体来算,那么
双字最高位为0,表示导入符号是一个数值,是一个RVA数值(比如我们的Msg可以利用符号导入)
双字最高位为1,那么表示导入的符号是一个名称(比如Msg的名字)
我们查看下user32.dll,里面的导出函数是Msg,我们看下它的序号是什么.
名字则直接是MessageBoxA了
可以使用
IAT结构数组结构表格
typedef struct _IMAGE_THUNK_DATA32 {union {PBYTE ForwarderString;PDWORD Function;DWORD Ordinal;PIMAGE_IMPORT_BY_NAME AddressOfData;} u1; } IMAGE_THUNK_DATA32;
表示IAT是按照什么加载的,序号加载,还是名称加载.
三丶定位导入表
在数据目录中,记录的是导入表的RVA偏移
那么我们通过公式计算一下在文件中的偏移
这里使用标准PE
在数据目录中找到偏移为 2010 RVA = 2010 位置
现在找模块地址
模块地址在 选项头(或者叫做扩展头)的成员ImageBase中存储着 ,现在是00401000
那么现在要找节表
节表中记录了虚拟地址的RVA 也就是虚拟地址和模块首地址的RVA,我们则可以快速定位是哪个节表了.
这个显然不是,1000的RVA,距离1000的位置,那么虚拟地址就是00401000 我们的虚拟地址是 00402010
那么看下下边的节表
402000位置,显然这个就是了
那么根据快速转换公式得到
VA = 402010
FA = 402010 - 402000 + pointertoRawData(不截图了,是400)
FA = 410
那么410位置就是导入表了.我们查看位置
按照上面的结构体,我们可以知道DLL 的RVA地址,那么现在是
206A 计算得出 FA = 6A + 400 = 46A,那么我们看看46A的位置是不是DLL名称
,一句IAT的RVA偏移地址,得出IAT表格位置
现在是2008
FA = 8+400 = 408
那么408的位置就是IAT表格了
可以看出,表格中前四个字节还记录了一个RVA偏移
那么这个偏移代表的就是函数名字的位置
FA = 5C+400 = 45C
那么45C的位置记录就是函数名称了
注意黄色方框的两个字节,这个字节就是上面说的 高低双字代表的意义
如果高字为1,那么这个API地址则是函数名导入
如果高字为0,那么就是序号导入
作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)
转载于:https://www.cnblogs.com/iBinary/p/7659132.html
PE格式第四讲,数据目录表之导入表,以及IAT表相关推荐
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...
- oracle按表导入impdp,oracle expdp、impdp导入从原表空间更换到其他表空间 ----导入到另个表空间测试...
expdp数据泵 优点:支持并发多线程方式,可以远程导出,性能显著提高,可开并行parallel=n,比exp/imp实用工具相比,导出提高了10倍左右,导入提高了5倍左右.能根据备份时收集的元数据, ...
- [系统安全] 三十四.恶意代码检测(4)编写代码自动提取IAT表、字符串及时间信息
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 数据库表内导入txt
数据库表内导入txt oracle数据库表内导入txt 首先准备TXT格式的文件,(可以从数据库导出) 1:准备ctl文件(导入字段映射以及字符集设置) 2:准备shell文件,执行导入命令(传入文件 ...
- 导入表解析,IAT表解析【滴水逆向三期53笔记】
我们再上一章节简要介绍了IAT表,我们知道如果程序调用dll中的函数时,必须通过IAT表来找到函数,我们基本了解了IAT表之后,我们今天来讲解一下导入表,通过本章节的学习,我们可以了解导入表,也能对I ...
- oracle将表导入到表空间,关于ORALCE一个表空间的数据导入到另一个表空间的方法(原创)...
用户: whnaproject 所属表空间: whnaproject 新用户 : wniec 所属新表空间: wniec 要求:将用户whnaproject中的数 ...
- PE学习(四)第四章:导入表
第四章:导入表 windos加载器会一并加载导入表中的dll,并修改相应指令调用的函数地址. IMAGE_NT_HEADERS STRUCT{ Signature DWORD ? FileHead ...
- PE格式:导入表与IAT内存修正
本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入表结构的基础知识点,并通过前面编写的一些小案例,实现对内存的转储与导入表的脱壳修 ...
- openGL第四讲——像素格式管理
OpenGL基础技术讲座--像素格式管理 1.Windows下的调色板 OpenGL可以使用16色.256色.64K和16M真彩色.真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果 ...
- 判断字符串格式_Python基础教程,第四讲,字符串详解
本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...
最新文章
- 马斯克要往火星轨道送跑车,在深空待10亿年,静候外星人
- 【Python学习笔记】输入raw_input(),特殊情况下也可以用input()
- C++使用命名空间中成员的三种方式
- 2008年10月热点问题!(Platform)
- 什么是死锁(deadlock)?
- MOSS 2007基础:WSS 3.0 中的母版页(Master Pages)和内容页(Content Pages)
- Spring 基于构造函数的依赖注入
- C# - 关于过期Token的解决方案
- Mysql/Mariadb本地不可以登录,远程可以登录问题的解决
- MySQL配置root远程连接mysql授权远程
- 山东大学高频电子线路实验七 锁相环调频及解调实验详解
- 软件架构设计---软件架构文档化
- java中isprime_Java中的Arcane isPrime方法
- PHP实现微信网页登陆授权开发
- 【java】对象克隆protected Object clone() throws CloneNotSupportedException
- WPS-Word:下一页分节符不能分页,插入下一页分节符时下一节没有在新的一页开始
- springcloud 加入spring session通过zuul请求session不一致问题
- Orthogonal Convolutional Neural Networks
- 查看当前系统 jave 版本 ,Eclipse版本
- 最优化理论与KKT条件