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文件结构(四) 输出表的更多相关文章

  1. PE文件结构详解(四)PE导入表

    PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...

  2. PE文件结构详解(五)延迟导入表

    PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因 ...

  3. PE文件结构(三) 输入表

    PE文件结构(三) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输入表 输入函数,表示被程序调用可是它的代码不在程序代码中的,而在dll中的函数.对于这些函数.磁盘上的可执行文 ...

  4. Windows PE 第四章 导入表

    第四章 导入表 导入表是PE数据组织中的一个很重要的组成部分,它是为实现代码重用而设置的.通过分析导入表数据,可以获得诸如OE文件的指令中调用了多少外来函数,以及这些外来函数都存在于哪些动态链接库里等 ...

  5. COFF/PE文件结构

    COFF/PE文件结构 原创 C++应用程序在Windows下的编译.链接(二)COFF/PE文件结构 2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下, ...

  6. 初识PE文件结构

    前言 目前网络上有关PE文件结构说明的文章太多了,自己的这篇文章只是单纯的记录自己对PE文件结构的学习.理解和总结. 基础概念 PE(Portable Executable:可移植的执行体)是Win3 ...

  7. 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构

    2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...

  8. 利用PE数据目录的导入表获取函数名及其地址

    PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...

  9. PE文件结构详解(六)重定位

    前面两篇 PE文件结构详解(四)PE导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的: 在这里 ...

随机推荐

  1. HTML5----响应式(自适应)网页设计

    第一步:在网页代码的头部,加入一行viewport元标签 <meta name="viewport" content="width=device-width, in ...

  2. cocos2d-x环境搭建(win7+cocos2d-x-3.0)

    一.环境需准备的材料: 1.VS2012,下载地址:官网 2.cocos2d-x和cocostudio,下载地址:官网 3.eclispe,我用的是:adt-bundle-windows-x86_64 ...

  3. 《Javascript高级程序设计》读书笔记之bind函数详解

    为什么需要bind var name = "The Window"; var object = { name: "My Object", getNameFunc ...

  4. Vb.net/VB 声明API功能父窗口功能

    回想第一次敲房费,他说自己是api函数实现父窗口及其子窗口最小化的功能.现在再次遇到,自己就在思考,能不能继续使用API函数呢?答案当然是Of Course! 事实上细致看两者并没有多大的差别,先看看 ...

  5. 项目架构mvc+webapi

    mvc+webapi 项目架构 首先项目是mvc5+webapi2.0+orm-dapper+ef codefirst. 1.项目框架层次结构: 这个mvc项目根据不同的业务和功能进行不同的区域划分, ...

  6. MVC区域 vs2013 mvc 搭建基架项

    http://www.it165.net/pro/html/201404/12822.html

  7. 设计模式C++达到 3.抽象工厂

    简单工厂模式和工厂模式 要求 同类型的产品子类有共同的方法.这限制了产品子类的扩展.抽象工厂能client它提供了一个接口,它是client而不必指定产品的详细信息.创建多个产品系列产品对象.在归为一 ...

  8. UVa 11408 - Count DePrimes

    题目:一个数的素因子的和假设也是素数就叫做DePrimes,统计给定区间内的DePrimes. 分析:数论.本题使用用一种素数的筛法,欧拉筛法,也加线性筛法. 这样的方法,每次删选分两种情况:1.素因 ...

  9. 解决alaert.builder二次调用报错的bug

    报错的代码是: The specified child already has a parent. You must call removeView() on the child's parent f ...

  10. android笔记6——intent的使用

    今天挑出一节专门来说一下使用intent和intentfilter进行通信. 场景:一个Activity启动还有一个Activity. 前面已经讲了Fragment的切换,Fragment顾名思义是基 ...