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/
版权所有,欢迎保留原文链接进行转载:)
PE格式第四讲,数据目录表之导入表,以及IAT表的更多相关文章
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...
- PE格式第八讲,TLS表(线程局部存储)
PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...
- PE格式第六讲,导出表
PE格式第六讲,导出表 请注意,下方字数比较多,其实结构挺简单,但是你如果把博客内容弄明白了,对你受益匪浅,千万不要看到字数多就懵了,其实字数多代表它重要.特别是第五步, 各种表中之间的关系. 作者: ...
- SqlServer一张表数据导入另一张表,收藏使用,工作中更新数据错误很有用
sql一张表数据导入另一张表 1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表; 2.比如要将 arti ...
- 第四讲,数据目录表之导入表,以及IAT表
一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 它会Call 下边的Jmp位置 而Jmp位置则是对一个全局变量取内容. 看 ...
- 【HIVE】(1)建表、导入数据、外部表、导出数据
导入数据 1). 本地 load data local inpath "/root/example/hive/data/dept.txt" into table dept; 2). ...
- IAT表和导入表
1.关于IAT(import address table)表 当exe程序中调用dll中的函数时,反汇编可以看到,call后面并不是跟的实际函数的地址,而是给了一个地址:
- IAT表
0X0 0 DLL介绍 DLL翻译器为动态链接库,原来不存在DLL的概念只有,库的概念,编译器会把从库中获取的二进制代码插入到应用程序中.在现在windows操作系统使用了数量庞大的库函数(进程,内存 ...
- PLSQL 导入表到Oracle------》从一个表空间导入到其它表空间
在用PLSQL导入.dmp文件到Oracle时出现的问题如下: Import started on 2015/11/18 10:42:44E:\oracle\product\10.2.0\db ...
随机推荐
- Java面试系列之HashMap大扫盲汇总
PS:整理的稍微有点急,不足之处,望各路道友指正,List相关可以查看前一篇随笔! HashMap的工作原理是近年来常见的Java面试题,几乎每个Java程序员都知道HashMap,都知道哪里要用Ha ...
- [转载]历上最强的音乐播放器(jetAudio-8.0.5.320-Plus-VX
原文地址:历上最强的音乐播放器(jetAudio-8.0.5.320-Plus-VX-完全汉化版)下载作者:盖世天星 历上最强的音乐播放器(jetAudio-8.0.5.320-Plus-VX-完全汉 ...
- Mac Intellij Debug 模式
前言:本文的核心是记录debug的使用,与具体的操作系统无关. 1.什么是Debug Debug是程序的一种运行模式.用来发掘程序的走向,以及程序在运行过程中参数的变化. 2.Debug的作用 deb ...
- Mac 下如何使用sed -i命令
今天在学习Linux的过程中发现了sed这一项指令 首先,sed的全称是:Stream Editor 调用sed命令有两种形式: sed [options] 'command' file(s) sed ...
- 团队作业8——第二次项目冲刺(Beta阶段)--第六天
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 学号 成员 贡献比 201421123001 廖婷婷 16% 201421123002 翁珊 16% 201421123004 ...
- Beta版本冲刺前准备
Beta版本冲刺 经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会. 1.凡事预则立,在Beta开始前, ...
- 201521123045 <java程序设计>第11周学习总结
201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...
- 201521123024 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- java课程设计-算术运算测试
1. 团队名称.团队成员介绍 团队名称:cococo 团队成员 组长:网络1514叶城龙 201521123109 组员:网络1514余腾鑫 201521123108 2. 项目git地址 http: ...
- Oracle与Mysql区别简述
在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...