WINDOWS通过导出表获取API函数地址-LMLPHPkernel32.zip
以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数组,该数组与“函数名称字符串数组”中的项一一对应,存储的值就是对应的函数名称在“全部导出函数入口地址数组”中的索引值。

WINDOWS通过导出表获取API函数地址-LMLPHP
09-26 19:50