PE文件结构(四) 输出表
PE文件结构(四)
參考
书:《加密与解密》
视频:小甲鱼 解密系列 视频
输出表
一般来说输出表存在于dll中。输出表提供了 文件里函数的名字跟这些函数的地址, PE装载器通过输出表来改动IAT。
IMAGE_OPTIONAL_HEADER中的 DataDirectory[0] 提供了输出表的RVA。输出表是以一个IMAGE_EXPORT_DIRECTORY结构 開始的。
IMAGE_EXPORT_DIRECTORY结构:
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics; //未使用
DWORD TimeDateStamp; //文件生成的时间
WORD MajorVersion; //主版本。一般为0
WORD MinorVersion; //次版本,一般为0
DWORD Name; //指向dll名的RVA
DWORD Base; // 基数,一般为 1 (就是从1数起)
DWORD NumberOfFunctions; // AddressOfFunctions指向的数组的元素的个数
DWORD NumberOfNames; // AddressOfNames 指向的数组的元素的个数
DWORD AddressOfFunctions; // 函数地址数组ENT的RVA
DWORD AddressOfNames; // 函数名字数组EAT的RVA
DWORD AddressOfNameOrdinals; // 输出序列号数组的RVA,这个数组是以WORD为单位的,用来函数名字数组连接函数地址数组的
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
输出表主要就是来给PE载入器改动IAT的,即查找函数的入口地址。PE载入器查找函数的地址有两种方法,从序号查找,从函数名查找。
1. 从序号查找函数入口地址
PE载入器通过INT知道了序号。直接用这个序号 去找 函数地址数组EAT就能够了。
2. 从函数名查找函数入口地址
通过函数名,查找函数名数组ENT,找到这个函数名在数组中的序号 n(从0数起),然后取输出序列号数组的第n个值(从0数起)。
然后 以这个值为序号的的函数地址数组EAT的值就是这个函数的入口地址。
即 ENT[ 输出序列号数组[n] ]
实例分析:
比如找user32.dll 中AdjustWindowRect 这个函数。
先查看user32.dll的二进制文件。它的IMAGE_OPTIONAL_HEADER结构为:
图片1
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
从中能够知道:
Name: RVA 55C0h 文件偏移值:49C0h
Base: 1
NumberOfFunctions: 02DCh
NumberOfNmae:02DCh
AddressOfFunctions: RVA 3928h 文件偏移值:2D28h
AddressOfNames: RVA 4498h 文件偏移值:3898h
AddressOfNameOrdinals: RVA 5008h 文件偏移值:4408h
查看ENT数组所指向的字符串。能够知道AdjustWindowRect是第2个元素。
所以。查看AddressOfNameOrdinals所指向的输出序列号数组的第2个元素,能够发现值为 1。
图片2
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
再查看EAT中序号为1的元素(即第2个元素)值为021140h,这个就是AdjustWindowRect函数的RVA。
图片3
版权声明:本文博客原创文章,博客,未经同意,不得转载。
PE文件结构(四) 输出表的更多相关文章
- PE文件结构详解(四)PE导入表
PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...
- PE文件结构详解(五)延迟导入表
PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因 ...
- PE文件结构(三) 输入表
PE文件结构(三) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输入表 输入函数,表示被程序调用可是它的代码不在程序代码中的,而在dll中的函数.对于这些函数.磁盘上的可执行文 ...
- Windows PE 第四章 导入表
第四章 导入表 导入表是PE数据组织中的一个很重要的组成部分,它是为实现代码重用而设置的.通过分析导入表数据,可以获得诸如OE文件的指令中调用了多少外来函数,以及这些外来函数都存在于哪些动态链接库里等 ...
- COFF/PE文件结构
COFF/PE文件结构 原创 C++应用程序在Windows下的编译.链接(二)COFF/PE文件结构 2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下, ...
- 初识PE文件结构
前言 目前网络上有关PE文件结构说明的文章太多了,自己的这篇文章只是单纯的记录自己对PE文件结构的学习.理解和总结. 基础概念 PE(Portable Executable:可移植的执行体)是Win3 ...
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...
- 利用PE数据目录的导入表获取函数名及其地址
PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...
- PE文件结构详解(六)重定位
前面两篇 PE文件结构详解(四)PE导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的: 在这里 ...
随机推荐
- bootstrap jQuery Ztree异步载入数据,check选择&可加入、改动、删除节点
效果图: 一.下载zTree插件 地址:http://www.ztree.me 二.html代码 <link href="../Scripts/zTree/css/zTreeStyle ...
- PHP草根论之设计模式-訪问者模式
关于模式本身的概念,请參考网上其他文章 此处仅仅讨论在PHP实际开发过程中的应用 此模式适用范围极为受限,适用情景: 1.适用于项目维护过程,不适用于项目开发过程 2.新增需求,要求为一个/多个类添加 ...
- c++ 按行读取txt文本
CStdioFile 类的声明保存在 afx.h 头文件中. CStdioFile 类继承自 CFile 类, CStdioFile 对象表示一个用运行时的函数 fopen 打开的 c 运行时的流式文 ...
- ecshop首页调用指定分类的所有产品(指定一级调二级)
第一种方法 第一 在/includes/lib_goods.php下增加如下代码,用过网上的直接换掉就可以 function index_get_cat_id_goods_best_list($cat ...
- Python学习入门基础教程(learning Python)--3.2 if-else分支语句
if-else分支语句结构的特点是当conditon条件满足时,执行if下的语句块,当condition条件不满足时执行else下的语句块,也就是说根据条件来控制让某些语句执行,某些语句不被执行. i ...
- python学习笔记之11:图像用户界面
这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓“GUI工具包”的有很多,本文简要介绍最成熟的跨平台pythonGUI工具包- ...
- docker 现实---中小企业docker环境结构(五)
docker对于中小企业,设定paas他没有足够的能量,没有必要为,个人二手sandbox实用性和小点.我个人觉得,中小企业可以使用docker要规范发展.测试.生产环境. 他画了一个简单的图表: d ...
- POJ 1274 The Perfect Stall 水二分匹配
主题链接:id=1274">点击打开链接 呵呵 #include<cstdio> #include<cstring> #include<cstdlib&g ...
- SQL Server中的查询
本博文简介一下SQL Server中经常使用的几类查询及相关使用的方法. 一.ExecuteScalar方法获取单一值 ExecuteScalar方法是SqlCom ...
- gitLab添加ssh key
电脑新装了一台虚拟机,想要和gitLab建立一个安全的ssh连接,步骤如下 1.本机生成ssh key 系统环境:Linux 使用root用户登录,执行命令:ssh-keygen -t rsa -C ...