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表相关推荐

  1. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...

  2. oracle按表导入impdp,oracle expdp、impdp导入从原表空间更换到其他表空间 ----导入到另个表空间测试...

    expdp数据泵 优点:支持并发多线程方式,可以远程导出,性能显著提高,可开并行parallel=n,比exp/imp实用工具相比,导出提高了10倍左右,导入提高了5倍左右.能根据备份时收集的元数据, ...

  3. [系统安全] 三十四.恶意代码检测(4)编写代码自动提取IAT表、字符串及时间信息

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. 数据库表内导入txt

    数据库表内导入txt oracle数据库表内导入txt 首先准备TXT格式的文件,(可以从数据库导出) 1:准备ctl文件(导入字段映射以及字符集设置) 2:准备shell文件,执行导入命令(传入文件 ...

  5. 导入表解析,IAT表解析【滴水逆向三期53笔记】

    我们再上一章节简要介绍了IAT表,我们知道如果程序调用dll中的函数时,必须通过IAT表来找到函数,我们基本了解了IAT表之后,我们今天来讲解一下导入表,通过本章节的学习,我们可以了解导入表,也能对I ...

  6. oracle将表导入到表空间,关于ORALCE一个表空间的数据导入到另一个表空间的方法(原创)...

    用户:   whnaproject     所属表空间: whnaproject 新用户   : wniec            所属新表空间: wniec 要求:将用户whnaproject中的数 ...

  7. PE学习(四)第四章:导入表

    第四章:导入表 windos加载器会一并加载导入表中的dll,并修改相应指令调用的函数地址. IMAGE_NT_HEADERS STRUCT{  Signature DWORD ?  FileHead ...

  8. PE格式:导入表与IAT内存修正

    本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入表结构的基础知识点,并通过前面编写的一些小案例,实现对内存的转储与导入表的脱壳修 ...

  9. openGL第四讲——像素格式管理

    OpenGL基础技术讲座--像素格式管理 1.Windows下的调色板 OpenGL可以使用16色.256色.64K和16M真彩色.真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果 ...

  10. 判断字符串格式_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

最新文章

  1. 马斯克要往火星轨道送跑车,在深空待10亿年,静候外星人
  2. 【Python学习笔记】输入raw_input(),特殊情况下也可以用input()
  3. C++使用命名空间中成员的三种方式
  4. 2008年10月热点问题!(Platform)
  5. 什么是死锁(deadlock)?
  6. MOSS 2007基础:WSS 3.0 中的母版页(Master Pages)和内容页(Content Pages)
  7. Spring 基于构造函数的依赖注入
  8. C# - 关于过期Token的解决方案
  9. Mysql/Mariadb本地不可以登录,远程可以登录问题的解决
  10. MySQL配置root远程连接mysql授权远程
  11. 山东大学高频电子线路实验七 锁相环调频及解调实验详解
  12. 软件架构设计---软件架构文档化
  13. java中isprime_Java中的Arcane isPrime方法
  14. PHP实现微信网页登陆授权开发
  15. 【java】对象克隆protected Object clone() throws CloneNotSupportedException
  16. WPS-Word:下一页分节符不能分页,插入下一页分节符时下一节没有在新的一页开始
  17. springcloud 加入spring session通过zuul请求session不一致问题
  18. Orthogonal Convolutional Neural Networks
  19. 查看当前系统 jave 版本 ,Eclipse版本
  20. 最优化理论与KKT条件

热门文章

  1. NYOJ--106--背包问题
  2. HDU - 3506 Monkey Party
  3. MetaMask/metamask-extension/mascara 的运行实现
  4. linux下获取程序所在目录绝对路径
  5. 多域名证书的签名和自签名流程
  6. 《C#高效编程》读书笔记11-理解短小方法的优势
  7. 十年工龄的程序员为你揭示最危害程序员职业生涯的三大观念
  8. 关于解决keil4和mdk共存后51不能使用go to definition Of 'XXXXXX'问题
  9. SegmentFault D-Day 2016 年度总结报告
  10. uva 1045(二分图最大权匹配)