一.FileBufffer与ImageBuffer的区别
我们知道从文件直接读取数据是将文件在硬盘中直接复制过来,计算机是不能直接执行的,如果要让程序执行,必须要有一个“拉伸”的过程,也就是课程中所说的ImageBuffer,但是ImageBuffer是不能直接执行的,但是它已经具备了执行的条件,再执行之前,要将ImageBuffer放入到程序独立的4GB运行空间中,这里给出FileBuffer与ImageBuffer的图:
二.SizeOfRawData一定大于Misc.VirtualSize吗?
我们知道在区块中,VirtualSize存储的是节没有对齐前的实际大小。SizeOfRawData是该节在磁盘文件中对齐后的大小,但是SizeOfRawData一定大于VirtualSize吗?答案是否定的,我们在反汇编中不难发现:在声明了变量后,如果没有进行初始化,那么在内存中是不会有任何操作的,只是告诉了编译器这个变量,那我们不妨设想一下:如果在该节中有许多未初始化的变量,计算机会分配内存吗?当让不会,如果某一个节中存在已经被定义过但还未初始化的数据,那么文件在硬盘上不会显式的留出空间SizeOfRawData中不会算上未初始化数据的空间;但是此节的Misc.VirtualSize为加载到内存中时节的未对齐的大小,那么这个值就需要算上给未初始化留出来空间后的整个节的大小,故在内存中的节本身的总大小可能会大于硬盘中的此节文件对齐后的大小。
三.RVA转FOA
在ImageBuffer中我们已知了一个数据的地址,成为RVA那么我们如何在ImageBuffer中找到该数据的地址(FOA)呢?
这里给出简要思路:
1.计算该数据对ImageBase的偏移大小
2.计算该数据在第几个节(通过循环节表的PointToRaw和SizeOfRawData)
3.计算该数据相对该节的PointToRawData偏移量
4.通过第三步计算出来的偏移量在磁盘文件中找到该数据。
这一节课程没有很多的知识点,但是很重要,主要体现在课后作业中:
1.写一个程序,实现从FileBuffer到ImageBuffer再从ImageBuffer到FileBuffer
2.写一个程序,实现从RVA转化为FOA
在本专栏中下一章我会将写出的程序源码分享给大家
文章中可能有许多不准确或者是我理解不到位的地方,非常希望大家指出,我会虚心学习,希望我们共同进步!