蝙蝠岛资源网 Design By www.hbtsch.com
1.导出表的定义
导出表大多存在于DLL中,目的就是用来导出其他exe运行的函数。不管exe或者DLL的本质都是PE文件。
2.准备工作
写一个DLL文件并简单调用一下。
2.1主要代码
2.1.1 .C文件
[C++] 纯文本查看 复制代码
DLLIMPORT int Add(int a,int b){ return a+b;}DLLIMPORT int Sub(int a,int b){ return a-b;}DLLIMPORT int Mul(int a,int b){ return a*b;}DLLIMPORT int Div(int a,int b){ return a/b;}
DLLIMPORT关键字可以用来修饰某个函数或者时变量就会被导出。
2.1.2 .H文件
[C++] 纯文本查看 复制代码
DLLIMPORT int Add(int a,int b);DLLIMPORT int Sub(int a,int b);DLLIMPORT int Mul(int a,int b);DLLIMPORT int Div(int a,int b);
2.1.3 测试代码
[C++] 纯文本查看 复制代码
#include<Windows.h>#include<stdio.h>#include<stdlib.h>int main(){ typedef int(* FUNT)(int,int); //定义函数指针 HINSTANCE Hint = LoadLibrary("test.dll"); 调用先前写好的DLL if(Hint==NULL) { printf("DLL调用失败"); //测试 return 0; } FUNT ADD =(FUNT)GetProcAddress(Hint,"Add"); FUNT SUB =(FUNT)GetProcAddress(Hint,"Sub"); FUNT MUL =(FUNT)GetProcAddress(Hint,"Mul"); FUNT DIV =(FUNT)GetProcAddress(Hint,"Div"); int a=20,b=10; printf("和为%d\n",ADD(a,b)); printf("差为%d\n",SUB(a,b)); printf("积为%d\n",MUL(a,b)); printf("商为%d\n",DIV(a,b)); FreeLibrary(Hint); //释放 return 0;}
2.1.4 结果
2.2导出函数定义声明
[C#] 纯文本查看 复制代码
> EXPORTS Add @1 Div @2 Mul @3 Sub @4
3.导出表的位置
导出表位于扩展PE头的DIRECTORY DataDirectory[10]里,该数组有10个成员,第一个就是导出表,即DIRECTORY DataDirectory[0]。
[C++] 纯文本查看 复制代码
> typedef struct _IMAGE_DATA_DIRECTORY> {> DWORD VirtualAddress; //导出表开始的地址 **注意是RVA的值**> RVADWORD Size; //导出表大小> }> IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
关于PE文件结构前面提到很多,这里不再赘述,直接用StudyPE+工具找出,如图:
选中区域就是数组里的内容,
前四个字节就是导出表的位置:0x00006000是RVA(内存偏移地址)的值,要转化成FOA(文件偏移地址)才能分析;
这里简单说一下,RVA转FOA的步骤:
1.判断RVA是否位于PE头中,如果在,那么RVA==FOA;
2.判断RVA的值在哪一个区段中,求出RVA与该区段开始地址的差值;
3.FOA=节.PointerToRawData(节区在文件中开始地址)+差值
我们来手动算一下,
1.节表开始的位置在0x00000178,则RVA不属于PE头
2.观察可知RVA介于.edata和.idata区段之间,
(
差值为:0x00006000-0x00006000=0x0
3.FOA=0x2000+0x0=0x2000
接着四个字节就是导出表的大小:0x00000069;
4.导出表的结构
现在我们找到了导出表的文件地址,贴上导出表的数据结构和对应的二进制代码:
> [C] 纯文本查看 复制代码
typedef struct _IMAGE_EXPORT_DIRECTORY { **0x00** DWORD Characteristics; //用不到 **0x04** DWORD TimeDateStamp; //时间戳. 编译的时间. 把秒转为时间.可以知道DLL的编译时间.此处和标准PE头的第二个成员一样 **0x08** WORD MajorVersion; **0x0a** WORD MinorVersion; **0x0c** DWORD Name; //指向该导出表文件名的字符串,也就是这个DLL的名称 存储的RVA 地址,需要转换 **0x10** DWORD Base; // 导出函数的起始序号 **0x14** DWORD NumberOfFunctions; //所有的导出函数的个数 **0x18** DWORD NumberOfNames; //以名字导出的函数的个数 **0x1c** DWORD AddressOfFunctions; // 导出的函数地址的 地址表 RVA 即函数地址表 **0x20** DWORD AddressOfNames; // 导出的函数名称表的 RVA 即函数名称表 **0x24** DWORD AddressOfNameOrdinals; // 导出函数序号表的RVA 即函数序号表} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
直接从名字开始分析:导出表文件名所在的地址是:0x6050
差值:0x00006050-0x00006000=0x00000050;
FOA=0x00002000+0x00000050=**0x00002050**;
字符串以00结尾,可知该DLL的名字是test.dll;
**导出函数的起始序号(01)稍后分析;**
**导出函数的个数**在0x14位,为4个;
**以名字导出的函数**的个数在0x18位,为4个(说明DLL没有隐藏函数名字,转用序号调用);
导出函数有4个,所以导出函数的地址有4个,是连续的;
**函数地址表**
标签:
PE导出表分析
蝙蝠岛资源网 Design By www.hbtsch.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
蝙蝠岛资源网 Design By www.hbtsch.com
暂无PE导出表分析的评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 房东的猫2017-房东的猫[科文音像][WAV+CUE]
- 杨乃文.2016-离心力(引进版)【亚神音乐】【WAV+CUE】
- 群星.2024-珠帘玉幕影视原声带【TME】【FLAC分轨】
- 芝麻龙眼.2008-光阴隧道民歌记录3CD【乡城】【WAV+CUE】
- 谭艳《再度重相逢HQII》头版限量[低速原抓WAV+CUE][549M]
- ABC唱片《蔡琴三十周年纪念版》6N纯银镀膜 [WAV+CUE][1.1G]
- 海来阿木《西楼情歌》开盘母带[WAV+CUE][1.1G]
- TheGesualdoSix-QueenofHeartsLamentsandSongsofRegretforQueensTerrestrialandCele
- 王建杰2011-荣华富贵[喜玛拉雅][WAV+CUE]
- 孙悦2024-时光音乐会[金蜂][WAV+CUE]
- 秦宇子.2020-#YUZI【海蝶】【FLAC分轨】
- 苏有朋.1994-这般发生【华纳】【WAV+CUE】
- 小虎队.1990-红蜻蜓【飞碟】【WAV+CUE】
- 雷婷《寂寞烟火HQⅡ》头版限量[低速原抓WAV+CUE][1G]
- 赵传1996《黑暗英雄》台湾首版[WAV+CUE][1G]