上一节课中我写好了_IMAGE_OPTIONAL_HEADER头的前10个成员,今天我接着来完善这个结构中最重要的两个成员,在学习第11个第12个成员之前我们先来认识一下PE磁盘文件与内存映像结构图。 做一个RVAtoRAW的转换练习(根据上节课讲的转换公式) RVA: (Relative Virtual Address 简称RVA),RVA只是内存中的一个简单的相对于PE文件装入地址的偏移位置,或称为偏移量。公式: 目标地址 401000h ---装入地址(Imagebase) 400000h=RVA 1000h VA:在PE用语里,实际的内存地址被称作虚拟地址(Virtual Address )简称VA。即OD里面能看到的地址 公式: 虚拟地址 VA =装入地址(Imagebase) + 相对虚拟地址(RVA) File Offset:当PE文件存储在磁盘上时,某个数据的位置相对于文件头的偏移量,称为文件地址。即C32里面能看到的地址 公式: 文件偏移-文件中节区的起始位置=内存偏移-内存中节区的起始位置
文件偏移=内存偏移-内存中节区的起始位置+文件中节区的起始位置
PELord也提供了偏移转换的专用计算器(非常强大) 进入正题: 上一节课中我们讲解了_IMAGE_OPTIONAL_HEADER 头的前10个成员,有了刚才的基础后,我们来看一下接下来的第11个第12个成员。 成员11,4个字节,表示段加载后在内存中的对齐方式。内存中节对齐的粒度。例如,如果该值是4096 (1000h),那么每节的起始地址必须是4096的倍数。若第一节从401000h开始且大小是10个字节,则下一节必定从402000h开始,
即使401000h和402000h之间还有很多空间没被使用。因为Windows管理内存采用分页管理的方式,而每页的大小为4k,也就是1000h,所以我们这个值为”00100000”。 成员12,4个字节,表示段在文件中的对齐方式。文件中节对齐的粒度。例如,如果该值是(200h),,那么每节的起始地址必须是512的倍数。若第一节从文件偏移量200h开始且大小是10个字节,则下一节必定位于偏移量400h: 即使偏移
量512和1024之间还有很多空间没被使用。此值最好设为200h,所以该成员的值为“00020000”。
在文件中把这两个成员完善
课件打包:
|