PE文件结构详解(三)PE导出表

上传人:te****st 文档编号:3199053 上传时间:2017-07-31 格式:DOC 页数:5 大小:165.50KB
返回 下载 相关 举报
PE文件结构详解(三)PE导出表_第1页
第1页 / 共5页
PE文件结构详解(三)PE导出表_第2页
第2页 / 共5页
PE文件结构详解(三)PE导出表_第3页
第3页 / 共5页
PE文件结构详解(三)PE导出表_第4页
第4页 / 共5页
PE文件结构详解(三)PE导出表_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《PE文件结构详解(三)PE导出表》由会员分享,可在线阅读,更多相关《PE文件结构详解(三)PE导出表(5页珍藏版)》请在金锄头文库上搜索。

1、PE文件结构详解(三)PE导出表PE文件 结构详解(三)PE 导出表上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,DataDirectory中的每一项都可以用这个函数获取,函数原型如下:PVOID NTAPI RtlImageDirectoryEntryToData(PVOID Base, BOOLEAN MappedAsImage, USHORT Directory, PULONG Size);Base:模块基地址。MappedAsImage

2、:是否映射 为映象。Directory:数据目 录项的索引。Size:对应数据目录项的大小,比如Directory为0,则表示导出表的大小。 返回值表示数据目录项的起始地址。这次来看看第一项:导出表。导出表是用来描述模块中的导出函数的结构,如果一个模块导出了函数,那么这个函数会被记录在导出表中,这样通过GetProcAddress函数就能动态获取到函数的地址。函数导出的方式有两种,一种是按名字 导出,一种是按序号导出。这两种导出方式在导出表中的描述方式也不相同。模块的导出函数可以通过Dependency walker工具来 查看:上图中红框位置显示的就是模块的导出函数,有时候显示的导出函数名字

3、中有一些符号,像 ?0CP2PDownloadUIInterfaceQAEABV0Z,这种是导出了C+的函数名,编译器将名字进行了修饰。下面看一下导出表的定义吧:结构还算比较简单,具体每一项的含义如下:Characteristics:现在没有用到,一般为0。TimeDateStamp:导出表生成的 时间戳,由连接器生成。MajorVersion,MinorVersion:看名字是版本, 实际貌似没有用,都是0。Name:模块的名字。Base:序号的基数,按序号导出函数的序号值从Base开始递增。NumberOfFunctions:所有 导出函数的数量。NumberOfNames:按名字导出函数

4、的数量。AddressOfFunctions:一个RVA,指向一个DWORD数组,数组中的每一项是一个导出函数的RVA,顺序与导出序号相同。AddressOfNames:一个RVA,依然指向一个DWORD数组,数组中的每一项仍然是一个RVA,指向一个表示函数名字。AddressOfNameOrdinals:一个RVA, 还是指向一个WORD 数组,数组中的每一项与AddressOfNames中的每一项对应,表示 该名字的函数在AddressOfFunctions中的序号。第一次接触这个结构的童鞋被后面的5项搞晕了吧,理解这个结构比结构本身看上去要复杂一些,文字描述不管怎么说都显得晦涩,所谓一图

5、胜千言,无 图无真相,直接上图:在上图中,AddressOfNames指向一个数组,数组里保存着一组RVA,每个RVA指向一个字符串,这个字符串即导出的函数名,与 这个函数名对应的是AddressOfNameOrdinals中的对应项。 获取导出函数地址时,先在 AddressOfNames中找到对应的名字,比如Func2,他在AddressOfNames中是第二项,然后从AddressOfNameOrdinals中取出第二项的值,这里是2,表示函数入口保存在AddressOfFunctions这个数组中下标为2的项里,即第三项,取出其中的值,加上模 块基地址便是 导出函数的地址。如果函数是以序号导出的,那么查找的时候直接用序号减去Base ,得到的值就是函数在AddressOfFunctions中的下标。用代码实现如下:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 化学工业

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号