本文共 1848 字,大约阅读时间需要 6 分钟。
节表和节——PE文件到内存的映射
.data :未初始化的数据
Rsize:只存有用数据
PE文件执行时 ,Windows装载器建立好虚拟地址和PE文件之间的映射关系
Windows装载器在装载DOS部分、PE文件头部分和节表部分时不进行任何处理
装载节的时候将根据节的属性做不同的处理
内存页的属性
节的偏移地址
节的尺寸
不进行映射的节
节表和节——节表
PE文件头后是节表,在winnt.h下如下定义
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];//节表名称,如“.text”
//IMAGE_SIZEOF_SHORT_NAME=8
union {
DWORD PhysicalAddress;//物理地址
DWORD VirtualSize;//真实长度,这两个值是一个联合结构,可以使用其中的任何一个,
//一般是节的数据大小
} Misc;
DWORD VirtualAddress;//RVA
DWORD SizeOfRawData;//物理长度
DWORD PointerToRawData;//节基于文件的偏移量
DWORD PointerToRelocations;//重定位的偏移
DWORD PointerToLinenumbers;//行号表的偏移
WORD NumberOfRelocations;//重定位项数目
WORD NumberOfLinenumbers;//行号表的数目
DWORD Characteristics;//节属性 如可读,可写,可执行等
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
Name1字段
定义了节的名称
.text .data .rdata .rsrc
VirtualSize字段
节的数据在没有进行对齐处理前的实际大小
VirtualAddress字段
节被装载到内存中后的偏移地址 RVA
SectionAlignment的值的整数倍
PointerToRawData字段
节在磁盘文件中的所处的位置
SizeOfRawData字段
节在磁盘文件中所占的空间大小
VirtualSize字段的值按照FileAlignment的值对齐以后的大小
Characteristics字段
重要的节属性定义:
#define IMAGE_SCN_CNT_CODE 00000020h // 节中包含代码
#define IMAGE_SCN_CNT_INITIALIZED_DATA 00000040h // 节中包含已初始化数据
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 00000080h // 节中包含未初始化数据
#define IMAGE_SCN_MEM_DISCARDABLE 02000000h
// 是一个可丢弃的节,即节中的数据在进程开始后将被丢弃
#define IMAGE_SCN_MEM_NOT_CACHED 04000000h // 节中数据不经过缓存
#define IMAGE_SCN_MEM_NOT_PAGED 08000000h // 节中数据不被交换出内存
#define IMAGE_SCN_MEM_SHARED 10000000h // 节中数据可共享
#define IMAGE_SCN_MEM_EXECUTE 20000000h // 可执行节
#define IMAGE_SCN_MEM_READ 40000000h // 可读节
#define IMAGE_SCN_MEM_WRITE 80000000h // 可写节
代码节属性 —— 60000020h
数据节属性—— c0000040h
常量节属性 —— 40000040h
Name:节名称 VOffset:相对于ImageBase的虚拟偏移(内存中) VSize:实际大小,有效数据的大小(文件中) ROffset:相对于文件起始处的偏移(文件中) RSize所占的文件空间大小(文件中),rsize是在文件中的大小,因为被填充的也存在文件中 Flags:节属性 |
节表和节——节
“节(Section)”跟在节表之后,一般PE文件都有几个“节”。比较常见的有:
代码节
已初始化的数据节
未初始化的数据节
资源节
引入函数节
引出函数节
转载地址:http://tpumf.baihongyu.com/