首页 > 其他 > 详细

PE 导出表

时间:2020-02-17 23:23:34      阅读:73      评论:0      收藏:0      [点我收藏+]

知识点:一个可执行程序是由一堆PE文件构成的!如下图可解释:

我加载的是一个.exe,但是后面还有需要的.dll文件,大家都知道.dll也有PE文件,这里也就又有一个问题了,为什么要引入这么多的.dll文件呢?

因为一个exe还需要使用这些.dll中所提供的函数,这些dll中就有相应的导出表,然后exe用LoadLibrary动态加载,最后通过GetProcAddress到获取函数的地址!

技术分享图片

知识点:

1、exe程序一般只有导入表,但并不是一定,有可能也有导出表
2、dll程序一般导出表和导入表都有


在扩展PE头是一个名为_IMAGE_OPTIONAL_HEADER的结构体

其中存在一个结构体数组为IMAGE_DATA_DIRECTORY,个数有16个,总占128字节

其中有两个该类型的结构体的名称分别为:导出表IMAGE_DIRECTORY_ENTRY_EXPORT和导入表IMAGE_DIRECTORY_ENTRY_IMPORT

结构体成员都如下:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress; //虚拟地址,存储当前导出表的地址
    DWORD   Size; //存储 当前导出表的大小
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

那么蓝颜色的就是该总的结构体大小

技术分享图片

那么IMAGE_DIRECTORY_ENTRY_EXPORT的结构体就是前八个字节,如下:

导出表的结构体 80 AD 02 00 78 01 00 00

导出表的虚拟地址为:0002AD80

导出表的大小为:00000178

这里的文件对齐和内存对齐的大小是一样的

技术分享图片

如果不一样还需要先将RVA地址转换为FOA的地址

导出表的结构体如下:

typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Name;
    DWORD   Base;
    DWORD   NumberOfFunctions;
    DWORD   NumberOfNames;
    DWORD   AddressOfFunctions;     // RVA from base of image
    DWORD   AddressOfNames;         // RVA from base of image
    DWORD   AddressOfNameOrdinals;  // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

PE 导出表

原文:https://www.cnblogs.com/zpchcbd/p/12323820.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!