首先需要知道FILE_BUFFER是什么,FILE_BUFFER就是文件存放在磁盘上的空间,IMAGE_BUFFER指的是文件在内存上存放的空间,而从磁盘到内存上,文件到底发生了什么。在这里先简略介绍一个,因为其中还有其他的很多因素,导入表,重定位表,段页,虚拟内存等等
首先,当我们点下鼠标,OS会给文件分配可选文件头中的虚拟的4GB大小的空间(我们不考虑虚拟内存,认为OS将这个文件全都存放在内存上的一个连续空间中)。
- 这个SizeOfImage的大小包括:DOS头大小,垃圾数据,NT文件头,节表的大小,每个节表的SectionAlignment;字段,使用 对齐函数(VirtualSize,SectionAlignment) 的返回值相加。这里的对齐函数具体实现的功能就是将VirtualSize放大到SectionAlignment的整数倍。
然后,将文件的DOS文件头,垃圾数据,NT文件头,节表放入申请的空间中,位置是可选文件头中的ImageBase;字段
然后,将文件的各个节根据节表放入内存中,例如,将第一个节放入第一个节表的VirtualAddress;指示的位置,但是我们怎么知道在磁盘上的位置呢,使用的是第一个节表的PointerToRawData;字段,从文件开始存储的位置开始加上PointerToRawData;表示的就是这个节表开始的位置,读取的大小是SizeOfRawData
大概前期的过程就是这样,之后还会对导入表,重定位表进行操作,DLL映射到4GB的内存空间中