• PE文件学习(2)导入表导出表


    转自:evil.eagle
    https://blog.csdn.net/evileagle/article/details/12176797

    • 导出表是用来描述模块中的导出函数的结构,如果一个模块导出了函数,那么这个函数会被记录在导出表中,这样通过GetProcAddress函数就能动态获取到函数的地址。
    • 函数导出的方式有两种,一种是按名字导出,一种是按序号导出。这两种导出方式在导出表中的描述方式也不相同。
    typedef struct _IMAGE_EXPORT_DIRECTORY {
        DWORD   Characteristics;
        DWORD   TimeDateStamp;
        WORD    MajorVersion;
        WORD    MinorVersion;
        DWORD   Name;'模块的名字'
        DWORD   Base;'序号的基数,按序号导出函数的序号值从Base开始递增'
        DWORD   NumberOfFunctions;'所有导出函数的数量'
        DWORD   NumberOfNames;'按名字导出函数的数量'
        DWORD   AddressOfFunctions; '指向一个DWORD数组,数组中的每一项是一个导出函数的RVA,顺序与导出序号相同。'
        DWORD   AddressOfNames;'指向一个DWORD数组,数组中的每一项是一个RVA,指向一个表示函数名字'
        DWORD   AddressOfNameOrdinals;'指向一个WORD数组,数组中的每一项与AddressOfNames中的每一项对应,表示该名字的函数在AddressOfFunctions中的序号。'
    } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
    

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

  • 相关阅读:
    基于.Net6.0开发WebApi(三) —— 项目中一些运用技巧
    JS FreeCodeCamp
    AutoCAD VBA打开文件对话框
    VBNET设置程序自启动
    C# 将html网页生成pdf
    C#生成二维码 使用ZXing.Net和ThoughtWorks.QRCode
    C# 生成html文件
    C# 调用打印机打印机pdf
    docker基础镜像修改生成步骤
    左膝核磁结果,右侧核磁结果
  • 原文地址:https://www.cnblogs.com/l0nmar/p/12553844.html
Copyright © 2020-2023  润新知