PE手工分析-导入表和导入函数地址表分析
2013-05-15 12:47
274 查看
原文地址:http://www.cnblogs.com/SkyMouse/archive/2012/05/10/2493775.html
PE手工分析-导入表和导入函数地址表分析
在上篇:PE手工分析-PE头 中我们了解了PE文件头内容,在此基础上我们来分析一下导入表和导入函数地址表的内容.还是使用上篇使用的PE文件来分析,上一篇中我们基本上已经定位出PE头的位置以及相应内容.
在PE扩展头中包含 IMAGE_DATA_DIRECTORY
DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
通过该数据目录表我们可以进一步对导入表和导入函数地址表进行详细的分析(其数据目录表分析也雷同)
详细信息可以查看MSDN定义.
数据目录表结构定义:
?
索引 | 数据目录表 | 文件偏移地址 | 偏移 | 大小 | 说明 |
0 | 导出表 | 00000170h | 00 00 00 00 | 00 00 00 00 | 没有导出 |
1 | 导入表 | 00000178h | 00 E0 01 00 | 64 00 00 00 | |
| ... | | | | |
12 | 导入地址表 | 000001d0h | A0 E2 01 00 | 3C 02 00 00 | |
| … | | | | |
| ... | | | | |
| ... | | | | |
导入表RVA=01E000
IAT RVA=01E2A0
RVA的概念请参考:RVA,另外可以参考《加密解密ii》中的第二章介绍
![](http://pic002.cnblogs.com/images/2012/152159/2012051009195451.png)
了解了RVA之后我们就明白了在获取导入表的RVA之后需要根据节地址转换成文件相对地址FOA
所以为了获取导入表的文件相对地址需要对PE的节表进行分析
首先需要知道节表所在的位置(紧跟数据目录表结尾)
总共16个数据目录,导入地址函数表在第12(0开始)个位置
节表起始位置=1d0+8+3×8=1F0
节表结构如下:
?
每个节包含40个字节
总共占有空间:40×7=280(0x118)->01F0-20E
![](http://pic002.cnblogs.com/images/2012/152159/2012051009322398.png)
可以看到每个节对应的内容如下:
段名称 | 虚拟地址 | 虚拟大小 | 物理地址 | 物理大小 | 标志 | PointerToRawData |
.textbss | 1000 | 0 | 10000 | 0 | 2EE0 | |
.text | 11000 | | 897D | 00008A00 | 60000020 | 00000400 |
.rdata | 1A000 | | 24B5 | 2600 | 40000040 | 8E00 |
.data | 01D000 | | 05F4 | 2000 | C0000040 | B400 |
.idata | 0001E000 | | 10C8 | 1200 | C0000040 | B600 |
.rsrc | 00020000 | | 0459 | 0600 | 40000040 | C800 |
.reloc | 00021000 | | 06DA | 0800 | 42000040 | CE00 |
?
?
![](http://pic002.cnblogs.com/images/2012/152159/2012051017321827.png)
![](http://pic002.cnblogs.com/images/2012/152159/2012051017323046.png)
OriginalFirstThunk指向地址(RVA)01E4DC->(FOA)BADC
FirstThunk指向地址(RVA)01E4AC->(FOA)BAAC对应结构为
?
?
相应的IAT分析如下:
RVA:01E2A0=>PointerToRawData:B600+(2A0)=B8A0在找到了IAT表的地址后让我们来看一下其中的内容
![](http://pic002.cnblogs.com/images/2012/152159/2012051017335221.png)
可以看到这里的BAAC正好处理B8A0的区域中.
所以很显然,FirstThunk属于IAT中的某一个地址区域
相应PE文件内容如下
Dll加载之前导入表结构
![](http://pic002.cnblogs.com/images/2012/152159/2012051017345873.gif)
在DLL加载之后导入表中内容将被操作系统填充为函数的VA
![](http://pic002.cnblogs.com/images/2012/152159/2012051017351663.gif)
到这里基本上已经把IAT和INT绑定起来了,而在函数调用过程中将如何实现调用IAT的函数地址呢?
程序中每个调用 API 函数的 CALL 指令所使用的地址都是相应函数登记在 IAT 表的地址
源文档 <http://blog.csdn.net/misterliwei/article/details/840983>
那么,IAT导入函数地址表,和导入表有什么联系呢??
其实,所有的DLL的IMAGE_IMPORT_DESCRIPTOR结构的FirstThunk指向的是一片连续的内存空间,第一个DLL的IMAGE_IMPORT_DESCRIPTOR结构的FirstThunk的值,就是IAT表的起始地址!
也就是说,导入表中的首个IMAGE_IMPORT_DESCRIPTOR的FirstThunk字段,在内存中,等同于IMAGE_NT_HEADER.OptionHeader.DataDirectory[12].VirtualAddress
数据目录表第13项,索引值为12,就是IAT了。
在RING3的API劫持中,很多人都会选择使用IAT劫持,也就是基于这个理论的。
源文档 <http://tieba.baidu.com/f?kz=726947835>
对于IAT和导入表之间的关系用如下图片作为结尾
![](http://pic002.cnblogs.com/images/2012/152159/2012051017354330.png)
导入表中的FirstThunk指向IAT表中的某一项
之前的理解有问题所以后面加以修改
相关文章推荐
- PE手工分析-导入表和导入函数地址表分析
- PE手工分析-导入表和导入函数地址表分析
- 内核分析PE获取DLL导出函数地址
- 内核分析PE获取DLL导出函数地址
- 利用PE数据目录的导入表获取函数名及其地址
- 利用PE数据目录的导入表获取函数名及其地址
- PE结构---获取导入表中函数的实际地址
- 内核分析PE获取DLL导出函数地址
- windows PE Image 文件分析(4)--- 导入函数的绑定
- 内核分析PE获取DLL导出函数地址
- Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取
- [转载]Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取
- Depends.exe —— PE依赖模块、导入导出函数查询
- 如何从PIMAGE_IMPORT_DESCRIPTOR节,得到某个API函数(导入函数)代码地址
- PE手工分析-PE头
- Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取
- IDA分析脱壳后丢失导入表的PE
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- Linux中程序的栈帧分析以及修改函数地址
- 逆向工程核心原理学习笔记1-通过IAT手工定位notepad.exe中的导入函数