PE 节表
节表:总大小占IMAGE_SECTION_HEADER
结构体(40字节) * 节的数量(大小取决于节的数量)
结构体为如下:
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //当前节的名称 , 占8字节
union {
DWORD PhysicalAddress;
DWORD VirtualSize; //在内存中实际占用的大小
} Misc;
DWORD VirtualAddress; //在内存中的偏移地址,该偏移地址加上imagebase就是当前节数据在内存中的真正地址
DWORD SizeOfRawData; //当前节表在文件中对齐后的大小
DWORD PointerToRawData; //当前节数据在文件中的偏移地址
DWORD PointerToRelocations; // 调试相关
DWORD PointerToLinenumbers;// 调试相关
WORD NumberOfRelocations;// 调试相关
WORD NumberOfLinenumbers;// 调试相关
DWORD Characteristics; //文件属性,比如该节数据属性是否为可执行属性,都在这里面
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
需要记住的:
VirtualSize
:当前节数据内存中文件对齐前的真实尺寸,什么意思呢?假如当前节数据实际大小是0x180,但是在文件中需要进行文件对齐(假设当前文件对齐大小为0x200),所以只能是0x200,所以必须多加0x80,而0x180其实就是这里说的 VirtualSize !
问题:自己也一直没理解在内存中文件对齐大小是什么意思,现在自己就直接把它 当作当前节表在没有进行文件对齐大小之前的大小
VirtualAddress
:当前节数据在内存中的偏移大小,当前节数据在内存中的地址位置就是该 VirtualAddress + ImageBase,数值总是SectionAlignment的值的整数倍
SizeOfRawData
:当前节数据在文件中对齐后的大小,那么也就是文件对齐之后的大小!
PointerToRawData
:当前节数据在文件中的偏移地址,当前节数据在文件中的地址位置就是该 PointerToRawData + 0,数值总是FileAlignment的值的整数倍
VirtualSize
可能会比SizeOfRawData
大 也可能会比小
比如定义的全局变量多但是没赋值,就不会存储在文件中,那么在内存中拉伸后的值可能VirtualSize 会比 SizeOfRawData 大!
比如定义的全局变量多并且都赋值,就会存储在文件中,那么在内存中拉伸后的值可能VirtualSize 会比 SizeOfRawData 大!
理解图:
知识点:
代码节的属性一般为60000020H
,也就是可执行、可读和"节中包含代码";
数据节的属性 一般为C0000040H
,也就是可读、可写和"包含已初始化数据";
而常量节(对应源代码中的.const段)的属性为40000040H
,也就是可读 和 "包含已初始化数据";
资源节的属性和常量节的属性一般是相同的。
关于文件属性:
标志(属性块) 常用特征值对照表:
[值:00000020h] [IMAGE_SCN_CNT_CODE // Section contains code.(包含可执行代码)]
[值:00000040h] [IMAGE_SCN_CNT_INITIALIZED_DATA // Section contains initialized data.(该块包含已初始化的数据)]
[值:00000080h] [IMAGE_SCN_CNT_UNINITIALIZED_DATA // Section contains uninitialized data.(该块包含未初始化的数据)]
[值:00000200h] [IMAGE_SCN_LNK_INFO // Section contains comments or some other type of information.]
[值:00000800h] [IMAGE_SCN_LNK_REMOVE // Section contents will not become part of image.]
[值:00001000h] [IMAGE_SCN_LNK_COMDAT // Section contents comdat.]
[值:00004000h] [IMAGE_SCN_NO_DEFER_SPEC_EXC // Reset speculative exceptions handling bits in the TLB entries for this section.]
[值:00008000h] [IMAGE_SCN_GPREL // Section content can be accessed relative to GP.]
[值:00500000h] [IMAGE_SCN_ALIGN_16BYTES // Default alignment if no others are specified.]
[值:01000000h] [IMAGE_SCN_LNK_NRELOC_OVFL // Section contains extended relocations.]
[值:02000000h] [IMAGE_SCN_MEM_DISCARDABLE // Section can be discarded.]
[值:04000000h] [IMAGE_SCN_MEM_NOT_CACHED // Section is not cachable.]
[值:08000000h] [IMAGE_SCN_MEM_NOT_PAGED // Section is not pageable.]
[值:10000000h] [IMAGE_SCN_MEM_SHARED // Section is shareable(该块为共享块).]
[值:20000000h] [IMAGE_SCN_MEM_EXECUTE // Section is executable.(该块可执行)]
[值:40000000h] [IMAGE_SCN_MEM_READ // Section is readable.(该块可读)]
[值:80000000h] [IMAGE_SCN_MEM_WRITE // Section is writeable.(该块可写)]