P49导出表

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

 

posted @ 2023-05-08 18:27  摸鱼小曹  阅读(29)  评论(0)    收藏  举报