Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144491
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-11 09:11
文章分类

全部博文(40)

文章存档

2020年(1)

2017年(36)

2014年(3)

我的朋友

分类: WINDOWS

2017-03-17 18:51:10

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


阅读(2948) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~