WindowsPE 第五章 导出表
导出表
PE中的导出表存在于动态链接库文件里。导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用。
5.1导出表的作用
代码重用机制提供了重用代码的动态链接库,它会向调用者说明库里的哪些函数是可以被别人使用的,这些用来说明的信息便组成了导出表。导出表存在的位置不是绝对的,通常EXE文件中很少有导出表(也可以有),而大部分DLL文件中都有导出表。所以一提到导出表,很多时候第一反应就是动态链接库。
导出表的两个租用:
一是可以通过导出表分析不认识的动态链接库所能提供的功能。
二是向调用者提供输出函数指令在模块中的起始地址。
5.1.1 分析动态链接库功能
略。就是说可以根据导出表函数猜测动态库功能等。
5.1.2 获得导出函数地址
对于一个动态链接库里导出的函数的调用,既可以通过函数名称来进行,也可以通过函数在导出表的索引来进行。Windows加载器将与进程相关的DLL加载到虚拟地址空间以后,会根据导入表中登记的与该动态链接库相关的由INT指向的名称或者编号来遍历DLL所在虚拟地址空间,通过函数名称或编号查找导出表结构,从而确定该到处函数在虚拟地址空间中的起始VA,并将该VA覆盖导入表的IAT相关项。
在覆盖IAT的过程中,导出表起到了参照和指引的作用。如果一个动态链接库没有定义导出表,其内部包含的所有函数都无法被其他程序透明的调用。这里所述的透明是指公开调用。如果是掌握动态链接库的内部编码,及时没有导出表,也可以随意引用里面的函数,哪怕这些函数是私有的。之后会说这个相关(5.5.2)。
5.2 含导出表的PE文件
为了方便说明,我还是自己创建一个DLL吧,用C++写吧,书上是用汇编写的。
5.3 导出表数据结构
5.3.1 导出表定位
导出表数据为数据目录中注册的数据类型之一,其描述信息位于数据目录第一个目录相中。
导出表所在地址RVA=0x00003A10
导出表数据大小 =0x000000061
再看这个
上面导出表RAV是0x3a10 大小0x61 应该是落在.radata的区间里了,也就是说这个导出表在.rdata里。
同时根据RVA-FOR转换可得到导出表数据所在文件偏移地址为:2010
5.3.2 导出目录IMAGE_EXPORT_DIRECTORY
导出数据的第一个结构是IMAGE_EXPORT_DIRECTORY。该结构详细定义如下:
导入表的IMAGE_IMPORT_EDSCRIPTOP个数与调用的动态链接库个数相等,而导出表的IMAGE_EXPORT_DIRECTORY只有一个。
5.3.3 导出表实例分析
下面以上面的那个动态链接库为例,进行PE文件导出表结构分析。
文件导出表节内容如下:
56 3a 00 00
对应IMAGE_EXPORT_DIRECTORY.Name字段,指向文件偏移0x00002056。对应的值为字符串DLLTest.dll,是动态链接库的名字。
01 00 00 00
对应IMAGE_EXPORT_DIRECTORY.nBase字段,表示起始编号为1。
03 00 00 00
对应IMAGE_EXPORT_DIRECTORY.NumberOfFunctions字段,表示有4个导出函数。
03 00 00 00
表示三个导出函数均是按照名称导出。
38 3A 00 00
对应IMAGE_EXPORT_DIRECTORY.AddressOfFunctions字段。从该位置去除连续3个地址,这些地址分别对应3个函数的RVA。
RVA:3A38 ---> FOA:2038
44 3A 00
对应IMAGE_EXPORT_DIRECTORY.AddressOfName字段。从该位置获取处的连续3个地址依次为:
RVA:3A44 ---> FOR:2044
和书上不一样,目前这个2044开始的不是三个函数名字,而是三个函数名字的地址,要据需往下找一层才能找到:
50 3A 00 00
对应IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals字段。从该位置去除的连续3个单子索引依次为:0 1 2
WindowsPE 第五章 导出表的更多相关文章
- WindowsPE 第五章 导出表编程-1(枚举导出表)
导出表编程-1-枚举导出表 开始前先回忆一下导出表: 1.枚举dll函数的导出函数名字: 思路: (1)加载dll到内存里. (2)获取PE头,逐步找到可选头部. (3)然后找到里面的第一个结构(导出 ...
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第五章 加载实体和导航属性 实体框架提供了非常棒的建模环境,它允许开发人员可视化地使 ...
- 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...
- 《Linux内核设计与实现》读书笔记 第五章 系统调用
第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...
- Java语言程序设计(基础篇) 第五章 循环
第五章 循环 5.2 while循环 1.while循环的语法如下: while(循环继续条件){ //循环体 语句(组); } 2.程序:提示用户为两个个位数相加的问题给出答案 package co ...
- 读《编写可维护的JavaScript》第五章总结
第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- Android深度探索--HAL与驱动开发----第五章读书笔记
第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...
随机推荐
- CVE-2019-10758-Mongo-express-远程代码执行
漏洞分析 https://xz.aliyun.com/t/7056 漏洞简介 mongo-express是一款mongodb的第三方Web界面,使用node和express开发. 如果攻击者可以成功登 ...
- 记客户端WebBrowser控件修改版本的问题
保留在本地电脑的一篇记录,第二条描述是在网上看来的,忘记在哪看的了,也就没注明出处,望见谅. 1.Winform内置浏览器控件的底层调用与系统IE浏览器的底层调用相同. 2.IE8 对渲染引擎做了很大 ...
- 鸿蒙应用程序Ability(能力)看这一篇就够
本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...
- WPF 基础 - Binding 对数据的转换和校验
1. Binding 对数据的转换和校验 Binding 中,有检验和转换关卡. 1.1 数据校验 源码: namespace System.Windows.Data { public class B ...
- [学习笔记] KM算法
前言 这个东西学了我挺久了,我先奉劝各位一定要先搞清楚匈牙利算法.感谢 \(\tt jzm\) 巨佬对我耐心的讲解,因为我太弱了所以卡了很久都不懂.如果你有任何问题请在本篇博客下面留言,我会尽力解答的 ...
- 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像
借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...
- CSS网页的布局
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- RocketMQ的安装配置:配置jdk环境,配置RocketMQ环境,配置集群环境,配置rocketmq-console
RocketMQ的安装配置 演示虚拟机环境:Centos64-1 (D:\linuxMore\centos6_64) root / itcast : 固定IP 192.168.52.128 一,配置J ...
- python基础之基本数据类型与基本运算符
一.基本数据类型 1.整数类型 作用:描述年龄.等级,电话号码等数据类型 age = 18 phone_number = 13572839204 2.浮点型 作用:描述薪资.身高等带小数的类型 hei ...
- Linux实战技能,教你轻松应对85%的使用场景
在Linux实操的过程中,你在网上也能搜到一堆参考资料,但是看完之后还是会觉得似懂非懂,无法举一反三,从网上复制粘贴了事,则极有可能不起作用. 如果侥幸解决了特定的问题,也意识到自己需要系统学习一下 ...