输出表详解

输出表一般存在于DLL中,用于输出模板函数,我们可以在数据目录表中的第二项查看到它的详细信息,输出表是由一个IED(IMAGE_EXPORT_DIRECTORY)构成的
这里的用例是看雪的 加密与解密第四版的输出表的那个示例DLL,如下图所示:

输出表
输出表的结构如下:
输出表结构图
可以看到,输出表的结构比输入表的结构要复杂,但是有好几项是我们所不需要关心的,Name成员之前的我们先忽略,重点讲解下Name之后的成员。
Name是指向与这个输出有关的DLL的名称的RVA
Base是基数,是用来索引到EAT(EXPORT_ADDRESS_TABLE)输出地址表的,一般为1,在通过序数查找的时候,要减去这个值。
例如我们用dumpbin查看一个DLL。
dumpbin
这里的序数值就是从1开始的,所以查找的时候要减去1,因为数组是从0开始索引的,hint就是在输出地址表的真正索引
NumberOfFunctions:函数的总数目,包括名字导出序号导出
NumberOfNames:名字导出的函数数目。所以NumberOfOrdinals 就是 NumberOfFunction - NumberOfNames
AddressOfFunctions:EAT的RVA
AddressOfNames:ENT的RVA
AddressOfNameOrdinals:是与ENT配对的数组,因为我们仅仅有ENT无法建立与EAT的联系,而再加一个索引素组,便可以知道ENT对应函数在EAT的索引是多少了,指向的数组是一个字的数组

下面我们进行实例分析:文件偏移是0xC00,跳到那里看一下:
在这里插入图片描述用Winhex跳到那里:

在这里插入图片描述
数据如下:
Characteristic~MinorVersion都为0,忽略这些次要信息
Name的RVA是0x4032,转换成文件偏移是0xC32,
Name
所以Dll的名字是DllDemo.DLL
Base的值是01
NumberOfFunction是1,函数总数是1
NumberOfNames也是1,说明无用序号导出的函数,有一个用名字导出的函数
EAT的RVA是0x4028,文件偏移是0xC28
ENT的RVA是0x402C,文件偏移是0xC2C
AddressOfNameOrdinals是0x4030,文件偏移是0xC30

因为只有一个函数,且该函数是有名字的,所以我们先看ENT
在这里插入图片描述
因为只有一项,这里指向ENT第0项的RVA,跳到这个RVA
ENT第0项的RVA指向的名字
导出函数名叫MsgBox
再来看它对应的索引是多少,我们知道MsgBox的索引号是0,所以去AddressOfNameOrdinals找索引为0的RVA,求得在EAT的索引号

在这里插入图片描述
看到它在EAT的索引是0,所以接着查找EAT的第0项RVA
在这里插入图片描述
得到MsgBox这个函数的导出RVA是0x1008

加密与解密的这个例子函数有点少,我们找下user32.dll再分析一下,
在这里插入图片描述
文件偏移是
在这里插入图片描述
跳到这里
在这里插入图片描述
分析下第一个
Name的RVA是0x093E9A,正是USER32.dll
在这里插入图片描述
Base是0x5DE
NumberOfFunctions是 0x04BF个
NumberOfNames是0x03E9个
EAT的RVA是0x091428
ENT的RVA是0x092724
AddressOfNameOrdinals的RVA是0x0936C8

看下第一个,这是ENT的第0项
在这里插入图片描述
在这里插入图片描述

查找第0项索引,索引是0x0004
在这里插入图片描述

查找EAT的第0x4项,RVA是0x03BFA0
在这里插入图片描述
验证下:
在这里插入图片描述
并且我们还知道user32.dll的Ordinal跟0x5DE是恰好匹配的。

猜你喜欢

转载自blog.csdn.net/qq_40890756/article/details/89715256