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中的下标。

  • 相关阅读:
    js 黑科技操作
    js判断是否是苹果浏览器
    rem750.js
    写过的bug
    mongdb学习
    [刘阳Java]_第一个Java程序_第7讲
    [刘阳Java]_步步窥探JS变量作用域
    [刘阳Java]_Web前端笔试题总结
    [刘阳Java]_酷炫视频播放器制作_JS篇
    [刘阳Java]_酷炫视频播放器制作_界面篇
  • 原文地址:https://www.cnblogs.com/l0nmar/p/12553844.html
Copyright © 2011-2022 走看看