IMAGE_SECTION_HEADER
#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //ASCII字符串,节名称,可以自定义,只截取8个
union { //Misc,是该节在没有对齐前的真实尺寸,该值可以不准确
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;
注意:
Misc 可能比 SizeOfRawData 要大,也可能比它小。在内存中展开时,哪个值大就按照哪个来展开。
IMAGE_SECTION_HEADER->Characteristics
数据位 | 常量符号 | 为1时的含义 |
---|---|---|
5 | IMAGE_SCN_CNT_CODE 或 00000020h | 节中包含代码 |
6 | IMAGE_SCN_CNT_INITIALIZED_DATA 或 00000040h | 节中包含已初始化数据 |
7 | IMAGE_SCN_CNT_UNINITIALIZED_DATA 或 00000080h |
节中包含未初始化数据 |
8 | IMAGE_SCN_LNK_OTHER 或 00000100h | 保留 |
25 | IMAGE_SCN_MEM_DISCARDABLE 或 02000000h | 节中的数据在进程开始以后被丢弃,如:.reloc |
26 | IMAGE_SCN_MEM_NOT_CACHED 或 04000000h | 节中的数据不会经过缓存 |
27 | IMAGE_SCN_MEM_NOT_PAGED 或 08000000h | 节中的数据不会被交换到硬盘 |
28 | IMAGE_SCN_MEM_SHARED 或 10000000h | 节中的数据将被不同的进程所共享 |
29 | IMAGE_SCN_MEM_EXECUTE 或 20000000h | 映射到内存后的页面包含可执行属性 |
30 | IMAGE_SCN_MEM_READ 或 40000000h | 映射到内存后的页面包含可读属性 |
31 | IMAGE_SCN_MEM_WRITE 或 80000000h | 映射到内存后的页面包含可写属性 |