首页
社区
课程
招聘
[求助][求助]关于IMAGE_EXPORT_DIRECTORY
发表于: 2015-8-11 15:23 4456

[求助][求助]关于IMAGE_EXPORT_DIRECTORY

2015-8-11 15:23
4456
1 IMAGE_EXPORT_DIRECTORY STRUCT【导出表,共40字节】
 2 {
 3 +00 h DWORD Characteristics ; 未使用,总是定义为0
 4 +04 h DWORD TimeDateStamp ; 文件生成时间
 5 +08 h WORD MajorVersion     ; 未使用,总是定义为0
 6 +0A h WORD MinorVersion ; 未使用,总是定义为0
 7 +0C h DWORD Name     ; 模块的真实名称
 8 +10 h DWORD Base     ; 基数,加上序数就是函数地址数组的索引值
 9 +14 h DWORD NumberOfFunctions ; 导出函数的总数
10 +18 h DWORD NumberOfNames ; 以名称方式导出的函数的总数
11 +1C h DWORD AddressOfFunctions ; 指向输出函数地址的RVA
12 +20 h DWORD AddressOfNames ; 指向输出函数名字的RVA
13 +24 h DWORD AddressOfNameOrdinals ; 指向输出函数序号的RVA
14 };IMAGE_EXPORT_DIRECTORY ENDS


首先说明自身情况
我是在学的PE,看了视频,看百度上的文章,感觉太过于程序化.我感觉有点难以理解.
所以希望对这个懂的童鞋,能给我解惑一下.谢谢您勒。



首先请看我的代码,内存之上的是我打开了一个 USER32.DLL的文件.
程序的目的是为了输出 IMAGE_EXPORT_DIRECTORY 结构体的信息

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

根据指示,我得知IMAGE_DATA_DIRECTORY 的 第0项保存着导出表信息

使用代码获取无误.与LOADPE载入后没有任何差距.

----------------------------------------------------------------------------
问题 1:我载入的是DLL文件,如果我载入一个EXE模块.并且这个模块里有 USER32.DLL    NTDLL.DLL  那么我第0项之内输出其中一个,那么其它的DLL 怎么办?

问题2:第七项 [+0C h DWORD Name     ; 模块的真实名称]

名称是一个DWORD类型, 我猜测这是一个偏移.

但这个 便宜是基于内存什么地方的偏移尼?

是这样吗:  [内存首地址  + IMAGE_DATA_DIRECTORY 结构体地址 + Name] 得出名称?
还是说: 【内存收地址 + Name 偏移】
试过了几个!都挂了~访问内存失败。什么的 原因

我感觉这个问题确实有点2 .但是是有点混乱。所以请赐教.
----------------------------------------------------------------------------

语言描述不到位.如果没看懂那个问题.可以留言 thx

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 207
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
回馈1: 刚才又测试了一下.竟然获取到了名称



其它~待补充
上传的附件:
2015-8-11 15:26
0
雪    币: 1258
活跃值: (1434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
导出表是 模块向外提供的 函数调用,
有序号导出,和名称导出,这个看情况
一般 导出表只有一个, 其 NAME 字段是 模块告诉外界 我是 “XX模块”
至于 有 三个RVA地址 ,

一个是导出函数名称   RVA :  AddressOfNames   
一个 导出序号 RVA  :     AddressOfNameOrdinals
一个导出函数地址 RVA     : AddressOfFunctions

形如三个 数组一样, 里面都是 RVA 值,
所以 你这样 解析  :  基址 + table [ index ] 就能得到  里面的值了

至于这个 基址 是内存里面,还是文件里面,  结合 数据目录里面的 VirtualAddress 字段来相应变换。

比如 是 Kernel32.dll  那么他 Name 字段就是存 " kernel32.dll" 的RVA地址。
2015-8-11 16:34
0
游客
登录 | 注册 方可回帖
返回
//