逆向编程一,PE结构拉伸内存
PE的加载从文件到内存有一个拉伸的过程,拉伸的原因是因为PE在文件中的对齐字节和在内存中的对齐字节可能不一样(文件对齐字节<=内存对齐字节,为了节省磁盘空间,目前的pe文件大部分文件和内存对齐字节都是一样的)。文件对齐字节在可选PE头里: _IMAGE_OPTIONAL_HEADER: 32 4 SectionAlignment 内存对齐 当加载进内存时节的对齐值(以字节计)。它必须≥FileAlignment。默认是相应系统的页面大小。 36 4 FileAlignment 文件对齐 用来对齐镜像文件的节中的原始数据的对齐因子(以字节计)。它应该是界于512和64K之间的2的幂(包括这两个边界值)。默认是512。如果 SectionAlignment 小于相应系统的页面大小,那么FileAlignment必须与SectionAlignment相等。 下面模拟PE文件加载时内存拉伸的过程: 1、读取文件,判断文件大小,分配一段与文件大小相同的内存缓冲区,filebuffer 2、读取DOS头结构,根据DOS头,判断第一个WORD e_magic,这是dos头标记‘MZ’,用来判断是否是pe文件格式,读取最后一个DWORD(e_lfanew)指向NT头 3、读取NT头结构,NT头包括PE签名、标准PE头和可选PE头。根PE头中的SizeOfImage是在内存中拉伸后的大小 4