导出表
如何定位导出表(这段写的不是很清楚)
在扩展pe头的最后一个成员(16个结构体*8bytes)中查找
导出表的属性在第一个结构体中:
第一个DWORD是导出表的RVA,要先转化成FOA
然后就可以找到导出表结构体
关键结构体:_IMAGE_EXPORT_DIRECTORY
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;
重要的有三张表:
-
函数地址表
-
函数名称表
-
序号表(2bytes)
序号表里的成员个数等于函数名称表里的成员个数
查找函数的原理:
API函数:
FARPROC GetProcessAddress(
HMODULE HModule, //dll模块句柄
LPCSTR lpProcName // 函数名
);
查找过程:
- 函数名称表 - 第0个 --> 序号表 - 第0个 --> 序号表第0个的值是4 --> 查函数地址表第4个的位置 === 找到函数
- 通过序号查找,序号-Base(导出表的开始编号) --> 函数地址表的偏移