导出表微总结

 

导入表和导出表是联合使用的!!!
大部分的dll有导出表,很少的EXE文件才有导出表


windows装载器在进行PE装载时候,会将导入表中登记的所有DLL一并装入,然后根据DLL的导出表中对导入函数的描述修正导入表的IAT值,

通过导出表,DLL文件向调用它的程序或者系统提供导出函数的名称,序号,以及入口地址
导出表的作用:
1.通过导出表分析不认识的dll中所能提供的功能
2.向调用PE提供函数指令在模块中的起始地址


windows加载程序修正导入表IAT过程
windows加载器将与进程相关的DLL加载到虚拟地址空间以后,会根据导入表中登记的与该动态链接库相关的由INT指向的名称或者编号来遍历DLL

所在虚拟地址空间,通过函数名或者编号查找导出表结构,从而确定该导出函数在虚拟地址空间中国的起始地址VA,并将VA覆盖导入表的IAT相关

项,在覆盖IAT的过程中,导出表起到了参照和指引的作用

导入表的个数与PE加载器的dll数目一致,而导出表只有一个

 

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;
记住导出函数有的有名字有的没有所以字段中的NumberOfNames大多数下是小于NumberOfFunctions(函数的个数)
nBase是导出函数编号的起始地址,某导出函数的第一个编号不是0而是nBase+0等是他的编号
AddressOfNames 双字 指向的是定义了函数名的函数的字符串地址
AddressOfNameOrdinals与AddressOfNames是一一对应的,只有有函数名的才有名字对应的序号,看下图
但是要知道AddressOfNameOrdinals索引号的来源是看的AddressOfFunctions的里面的索引编号
AddressOfFunctions的索引值对应的Hint/Name的Hint,不是函数编号
函数编号=索引值+Base

记住函数的地址走的是AddressOfFunctions最后都要走这,可不是AddressOfNames,它指向的是定义了函数名的函数的字符串地址。不一样

 

posted @ 2018-02-26 15:39  _Flame  阅读(140)  评论(0编辑  收藏  举报