zoukankan      html  css  js  c++  java
  • 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中的下标。

  • 相关阅读:
    Happy New Year
    CF1450G
    理希的NOI2020退役记
    luoguP4859 已经没有什么好害怕的了(二项式反演)
    知识点简单总结——二项式反演
    bzoj4671 异或图(斯特林反演,线性基)
    知识点简单总结——斯特林数、斯特林反演
    uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
    有标号DAG计数(生成函数)
    知识点简单总结——单位根反演
  • 原文地址:https://www.cnblogs.com/l0nmar/p/12553844.html
Copyright © 2011-2022 走看看