看了论坛大神的PE结构解析后,前边节表部分理解了。
c25K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6u0r3K9%4y4K6k6q4)9J5c8Y4c8#2N6r3!0J5K9h3q4D9i4K6u0r3j5$3S2S2M7o6S2Q4x3X3b7I4i4K6u0V1y4W2)9J5k6h3S2@1L8b7`.`.
但是到了输入表就郁闷了,文章说定位输入表的话,需要在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直播授课