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表的更多相关文章

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

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

  2. PE格式第八讲,TLS表(线程局部存储)

    PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...

  3. PE格式第六讲,导出表

    PE格式第六讲,导出表 请注意,下方字数比较多,其实结构挺简单,但是你如果把博客内容弄明白了,对你受益匪浅,千万不要看到字数多就懵了,其实字数多代表它重要.特别是第五步, 各种表中之间的关系. 作者: ...

  4. SqlServer一张表数据导入另一张表,收藏使用,工作中更新数据错误很有用

    sql一张表数据导入另一张表   1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法:   INSERT INTO 目标表 SELECT * FROM 来源表;   2.比如要将 arti ...

  5. 第四讲,数据目录表之导入表,以及IAT表

    一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 它会Call 下边的Jmp位置 而Jmp位置则是对一个全局变量取内容. 看 ...

  6. 【HIVE】(1)建表、导入数据、外部表、导出数据

    导入数据 1). 本地 load data local inpath "/root/example/hive/data/dept.txt" into table dept; 2). ...

  7. IAT表和导入表

    1.关于IAT(import address table)表 当exe程序中调用dll中的函数时,反汇编可以看到,call后面并不是跟的实际函数的地址,而是给了一个地址:

  8. IAT表

    0X0 0 DLL介绍 DLL翻译器为动态链接库,原来不存在DLL的概念只有,库的概念,编译器会把从库中获取的二进制代码插入到应用程序中.在现在windows操作系统使用了数量庞大的库函数(进程,内存 ...

  9. PLSQL 导入表到Oracle------》从一个表空间导入到其它表空间

        在用PLSQL导入.dmp文件到Oracle时出现的问题如下: Import started on 2015/11/18 10:42:44E:\oracle\product\10.2.0\db ...

随机推荐

  1. Tinyhttpd 代码学习

    前阵子,参加了实习生面试,被面试官各种虐,问我说有没有读过一些开源的代码.对于只会用框架的我来说真的是硬伤啊,在知乎大神的推荐下在EZLippi-浮生志找了一些源代码来阅读,于是从小型入手,找了Tin ...

  2. python爬虫-抓取acg12动漫壁纸排行设置为桌面壁纸

    ACG-wallpaper 初学python,之前想抓取P站的一些图片来着,然后发现acg12这里有专门的壁纸榜单,就写了个抓取壁纸作为mac桌面壁纸玩玩. 功能:抓取acg12壁纸榜单的动漫壁纸,并 ...

  3. js实现换肤效果

    一,js换肤的基本原理 基本原理很简单,就是使用 JS 切换对应的 CSS 样式表文件.例如导航网站 Hao123 的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 ...

  4. 软件工程(GZSD2015)第三次作业提交进度

    第三次作业题目请查看这里:软件工程(GZSD2015)第三次作业 开始进入第三次作业提交进度记录中,童鞋们,虚位以待哈... 2015年4月19号 徐镇.尚清丽,C语言 2015年4月21号 毛涛.徐 ...

  5. 201521123049 《JAVA程序设计》 第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  6. 201521123095 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出 ...

  7. 201521123015 《Java程序设计》第4周学习总结

    本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.多态:使用单一接口操作多种类型的对象. 2.private修饰属性,public修饰方法. 3 ...

  8. 你不知道的JavaScript——类型

    一.ECMAScript语言中所有的值均有一个对应的语言类型.ECMAScript语言类型包括Undefined.Null.Boolean.String.Number和Object. 我们这样来定义类 ...

  9. Eclipse rap 富客户端开发总结(2):rap项目目前的进度和存在的问题

    1. Eclipse rap项目目前的进度 目前rap 的最新版本是 rap 1.5M4,最稳定版本是 rap 1.4.1,我们项目目前使用的版本是rap 1.4.1,Rap目前已经支持的部分是 sw ...

  10. java web:在eclipse中如何创建java web 项目

    Eclipse创建java web工程 eclipse版本:eclipse-jee-4.5-win32-x64 tomcat版本:apache-tomcat-7.0.63-windows-x64 jd ...