首页
社区
课程
招聘
[求助]关于输入表在PE文件物理存放位置的疑问
发表于: 2013-4-9 21:09 3708

[求助]关于输入表在PE文件物理存放位置的疑问

2013-4-9 21:09
3708
看了论坛大神的PE结构解析后,前边节表部分理解了。
http://www.pediy.com/kssd/tutorial/chap8-1-6.htm

但是到了输入表就郁闷了,文章说定位输入表的话,需要在option_header的最后域--第二个数据组来定位。

但是数据结构的定义为:
IMAGE_DATA_DIRECTORY STRUCT

VirtualAddress    DWORD   ?    ;数据的起始RVA
isize             DWORD   ?    ;数据块的长度

IMAGE_DATA_DIRECTORY ENDS


VirtualAddress为数据的起始RVA啊,也就是说需要PE载入内存中才能定位啊,也就是这是一个逻辑偏移量而不是物理或者文件便宜。那么这是个什么情况,至少这些数据应该从文件中载入啊?不运行PE文件,只是二进制打开文件,就不能列举导入函数了吗?求高人解释下,谢谢了。

是不是上边的节表数据已经载入这部分了?

============================================================貌似明白了
分析:
明白了,确实是在前边的节表目录处已经将整个节表载入,而ITA只是该节表的一部分,这也说明了节表在文件中按属性物理划分类别的意思。

IMAGE_SECTION_HEADER

Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?) ;8个字节的节区名称
union Misc
PhysicalAddress dd ? ;
VirtualSize dd ? ;节区的尺寸
ends
VirtualAddress dd ? ;节区的RVA地址
SizeOfRawData dd ? ;文件中对齐后的尺寸
PointerToRawData dd ? ;区段在文件中的偏移
PointerToRelocations dd ? ;在OBJ文件中使用
PointerToLinenumbers dd ? ;行号表的位置(供调试用)
NumberOfRelocations dw ? ;在OBJ文件中的使用
NumberOfLinenumbers dw ? ;行号表中行号的数量
Characteristics dd ? ;节的属性

IMAGE_SECTION_HEADER ENDS


确定导入表在文件中的位置,假设为L:

1.我们可以在IMAGE_OPTIONAL_HEADER32的DataDirectory[2]中获得导入表的内存RVA,记作K
2.通过IMAGE_SECTION_HEADER的VirtualAddress与VirtualSize,以及IMAGE_OPTIONAL_HEADER32中的SectionAlignment,来计算每个节区在内存当中映射的RVA及其内存快大小,假设某一节表在内存中的RVA以及大小为A,N
3.遍历文件内的每个节表头信息,如果发现A<=K<=A+N,则说明导入表在这个节表内,该节表记作X。
4.通过节表X头(IMAGE_SECTION_HEADER)的PointerToRawData段,得到节表X在文件中的偏移M。

则最后,L=(K-A)+M。

这样就实现了对输入表的物理定位了,而不用载入PE的逻辑定位。不知道这样做对不对,求大神指点。

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
你去网上找个导出pe文件结构的例子应该就懂了,iat在pe文件中也有偏移。
以上仅为个人思考,错误之处敬请指出
2013-4-9 22:08
0
游客
登录 | 注册 方可回帖
返回
//