1、如何定位导出表:
数据目录项的第一个结构,就是导出表.
typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
VirtualAddress 导出表的RVA
Size 导出表大小
2、导出表结构
上面的结构,只是说明导出表在哪里,有多大,并不是真正的导出表.
如何在FileBuffer中找到这个结构呢?在VirtualAddress中存储的是RVA,如果想在FileBuffer中定位
必须要先将该RVA转换成FOA.
导出函数:
1、名字导出
2、序号导出
3、AddressOfFunctions说明:
该表中元素宽度为4个字节
该表中存储所有导出函数的地址
该表中个数由NumberOfFunctions决定
该表项中的值是RVA, 加上ImageBase才是函数真正的地址定位:
IMAGE_EXPORT_DIRECTORY->AddressOfFunctions 中存储的是该表的RVA 需要先转换成FOA
4、AddressOfNames说明:
该表中元素宽度为4个字节
该表中存储所有以名字导出函数的名字的RVA
该表项中的值是RVA, 指向函数真正的名称
特别说明:
1)函数的真正的名字在文件中位置是不确定的
2)但函数名称表中是按名字排序的,也就是说,A开头的函数在AddressOfNames排在最前面.但AXXXXXX这个真正的名字,可能排在BXXXXX后面
3)如果想打印名字,要先将AddressOfNames转换为FOA
5、AddressOfNameOrdinals
该表中元素宽度为2个字节
该表中存储的内容 + Base = 函数的导出序号
总结:
为什么要分成3张表?
1)函数导出的个数与函数名的个数未必一样.所以要将函数地址表和函数名称表分开.
2)函数地址表是不是一定大于函数名称表?
未必,一个相同的函数地址,可能有多个不同的名字.
3)如何根据函数的名字获取一个函数的地址?
1.遍历函数名称表 得出索引
2.当前索引.去序号表中查找.如果有.则取出当前序号表的序号.当做函数地址表的下标
3.得出下标. 返回函数地址 (RVA +IMAGEbase)
4)如何根据函数的导出序号获取一个函数的地址?
导出序号-Base
标签:RVA,函数,导出,地址,P49,序号,该表中 From: https://www.cnblogs.com/cspecialr/p/17382783.html