首页
社区
课程
招聘
[旧帖] [求助]PE结构中,导入表地址计算[已解决] 0.00雪花
发表于: 2008-4-6 15:16 5040

[旧帖] [求助]PE结构中,导入表地址计算[已解决] 0.00雪花

2008-4-6 15:16
5040
我通过可选头中“DataDiectorys”中第二元素:Image_directory_entry_import中前四个字节读取内存中的RVA地址,然后加可选头中的基址。然后将文件用OD加载,通过相加后的地址去寻找,为何寻得的地址处,不是相关API的名称,而在后若干地址的偏移后才是该数据?

请大家指点。

问题已解决, 感谢petnt的热情回复。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
输入目录是一个多IMAGE_IMPORT_DESCRIPTOR(输入描述结构)的数组,每个被使用的DLL文件都有一个。(它们的)列表由一个全部用0填充的IMAGE_IMPORT_DESCRIPTOR(输入地址表目录项)结构作为结束。
一个IMAGE_IMPORT_DESCRIPTOR(输入地址表目录项)是一个拥有下列成员的结构体:

OriginalFirstThunk(原始第一个换长)(汉译的说明见注释?)
它是一个RVA(32位),指向一个以0结尾的、由IMAGE_THUNK_DATA(换长数据)的RVA构成的数组,其每个IMAGE_THUNK_DATA(换长数据)元素都描述一个函数。此数组永不改变。

TimeDateStamp(时间日期戳)
它是一个具有好几个目的的32位的时间戳。让我们先假设时间戳为0,一些高级的情况将在以后处理。

ForwarderChain(中转链)
它是输入函数列表中第一个中转的、32位的索引。中转也是高级的东东。对初学者先将所有位设为-1。

Name(名称)
它是一个DLL文件的名称(0结尾的ASCII码字符串)的、32位的RVA。

FirstThunk(第一换长)
它也是一个RVA(32位),指向一个0结尾的、由IMAGE_THUNK_DATA(换长数据)的RVA构成的数组,其每个IMAGE_THUNK_DATA(换长数据)元素都描述一个函数。此数组是输入地址表的一部分,并且可以改变。

因此,数组中的每个IMAGE_IMPORT_DESCRIPTOR(输入描述结构)结构体都给出输出DLL文件的名称,并且,除了中转和时间日期戳,它还给出2个指向IMAGE_THUNK_DATA(换长数据)的数组的RVA,都是32位。(每个数组的最后一个成员都全部填充为0字节,以标志结尾。)

多看看有关pe头的文章吧
2008-4-6 17:33
0
雪    币: 47
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我的意思是我根据可选头,找到输入表的RVA,加上装入内存的基址后,到被OD加载后的该地址去找,没有找到。如上所述的结构体。按照输入表的数组元素描述来看,应该至少可以看到DLL名称的字符串,而我看到的全是乱码。

我想知道的是,是我的计算地址的方法不对,还是就应该是乱码?

内存中导入表地址我是通过如下方法计算的:导入表映射到内存中后,其地址是通过Image_directory_entry_import中前四个字节中的数据作为RVA地址,然后加可选头中的基址得到。
2008-4-7 00:00
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
我想 应该是 RVA+加载基址
这定位到输入表也无法立刻看到dll的文件名。因为Name依然是个RVA
2008-4-7 00:07
0
游客
登录 | 注册 方可回帖
返回
//