您好,欢迎来到外链网!
当前位置:外链网 » 站长资讯 » 专业问答 » 文章详细 订阅RssFeed

pe文件导出表,pe文件导入表

来源:互联网 浏览:60次 时间:2023-04-08

导出表位于数据目录表的第一个位置
导出表结构

typedef struct _IMAGE_EXPORT_DIRECTORY { +0x0 DWORD Characteristics; +0x4 DWORD TimeDateStamp; +0x8 WORD MajorVersion; +0xa WORD MinorVersion; +0xc DWORD Name; //指向该导出表文件名(RVA) +0x10 DWORD Base;//导出表的起始序号 (序号表的最小序号) +0x14 DWORD NumberOfFunctions; // 所有导出函数的个数(序号的最大减去最小+1) +0x18 DWORD NumberOfNames; //以函数名导出的函数的个数 序号表的个数 +0x1c DWORD AddressOfFunctions; //导出函数的地址表偏移(RVA) +0x20 DWORD AddressOfNames; //函数名称表偏移(RVA) +0x24 DWORD AddressOfNameOrdinals; //函数序号表偏移(RVA)} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

AddressOfFunctions 地址表大小由NumberOfFunctions决定
AddressOfNameOrdinals AddressOfName序号表和名字表的大小由 NumberOfNames决定

1:
GetProcAddress 通过函数名找函数地址的方式。 先通过函数名在名称表里面找到匹配的函数名,然后通过匹配函数名的序数在序号表相应的序数位置找到里面存的值 ,取出序号+Base,最后通过真正的序号作为地址表的偏移找到地址;

base+序号表里面的值=真正导出的序号

2:
通过导出序号的方式找函数地址,用给的序号值减去base,然后在地址表里面直接找这个索引的地址(RVA);

以NONAME形式导出的序号=地址表里面的索引加上base NONAME在序号表里面没有匹配项(有匹配项一定是以名字导出的)

从图上可以看出,以名字导出的函数一共有10个,AddressOfNameOrdinals中的序号有10个.
以第一个函数名为例子:
第一个函数索引为0,在序号表中查找第0个元素,找出来的序号是3.然后再地址表中找到第三个成员(4字节) 就找到了函数的RVA地址.

02410735