zoukankan      html  css  js  c++  java
  • 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

    再看这个

     

        上面导出表RAV0x3a10 大小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


  • 相关阅读:
    python 基础到字符串学习
    Newtonsoft.Json 获取匿名类数据
    Abp Wcf结合使用问题
    Ef Migration 操作出现SQLEXPRESS
    No context type was found in the assembly 'xxx.xxxx'. CodeFirst Ef错误
    Ef Code First 发生”provider: SQL Network Interfaces, error: 26
    ef 多条数据插入处理方案(据说还有更好的)
    记录一次 HttpWebRequest 尝试自动重定向太多 错误
    NetCore 下使用RSA加密,解密;并且前端使用jsencrypt.js实现Rsa相关方法。
    The specified framework version '2.0' could not be parsed 错误处理
  • 原文地址:https://www.cnblogs.com/csnd/p/12062141.html
Copyright © 2011-2022 走看看