-
-
[求助]关于输入表在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直播授课