kernel32.zip
以kernel32.dll为例,分析如何根据动态链接库基址定位导出表,从而定位API函数!
以kernel32.dll为例,分析如何根据动态链接库基址定位导出表,从而定位API函数!
导出表的结构定义如下:
IMAGE_EXPORT_DIRECTORY STRUCT【导出表,共40字节】
{
+00h DWORD Characteristics ; 未使用,总是定义为0
+04h DWORD TimeDateStamp ; 文件生成时间
+08h WORD MajorVersion ; 未使用,总是定义为0
+0Ah WORD MinorVersion ; 未使用,总是定义为0
+0Ch DWORD Name ; 模块的真实名称 +10h DWORD Base ; 基数,加上序数就是函数地址数组的索引值 +14h DWORD NumberOfFunctions ; 导出函数的总数
+18h DWORD NumberOfNames ; 以名称方式导出的函数的总数 +1Ch DWORD AddressOfFunctions ; 指向输出函数地址的RVA
+20h DWORD AddressOfNames ; 指向输出函数名字的RVA
+24h DWORD AddressOfNameOrdinals ; 指向输出函数索引的RVA };IMAGE_EXPORT_DIRECTORY ENDS
各字段详解:
- Base:导出函数序号的起始值;将AddressOfFunctions字段指向的“全部导出函数入口地址数组”的索引号+这个起始值=对应函数的“导出序号”。例如Base的值为X,那么“全部导出函数入口地址数组”重第一个函数的“导出序号”就是X。
- AddressOfFunctions:这是一个RVA值,指向“全部导出函数入口地址数组”,该数组是一个DWORD数组,每一项都是一个RVA值。
- AddressOfNames:这是一个RVA值,指向“函数名称字符串地址数组”,该数组是一个DWORD数组,每一项都是一个RVA值,指向一个函数名称字符串;
- AddressOfNameOrdinals:这是一个RVA值,指向一个WORD数组,该数组与“函数名称字符串数组”中的项一一对应,存储的值就是对应的函数名称在“全部导出函数入口地址数组”中的索引值。