总是在PE文件头开始的偏移00f8h处。
typedef struct _IMAGE_SECTION_HEADER
{
BYTE Name1[IMAGE_SIZEOF_SHORT_NAME]; // 8个字节 节表名称,如“.text”
//IMAGE_SIZEOF_SHORT_NAME=8
union
{
DWORD PhysicalAddress; // 物理地址 节区尺寸 未对齐前的实际大小
DWORD VirtualSize; // 真实长度,这两个值是一个联合结构,可以使用其中的任何一个,一般是取后一个
} Misc;
DWORD VirtualAddress; // 内存中节区的起始地址(RVA)
DWORD SizeOfRawData; // 在文件中对齐后的尺寸
DWORD PointerToRawData; // 在文件中的偏移量
DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移
DWORD PointerToLinenumbers; // 行号表的偏移(供调试使用地)
WORD NumberOfRelocations; // 在OBJ文件中使用,重定位项数目
WORD NumberOfLinenumbers; // 行号表中行号的数目
DWORD Characteristics; // 节属性如可读,可写,可执行等
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
Characterisitics
#define IMAGE_SCN_CNT_CODE 0x00000020 //节中保含代码
#define IMAGE_SCN_CNT_INTIALIZED_DATA 0x00000040 //节中包含已初始化代码
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 //节中包含未初始化代码
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 //节中的数据在进程开始以后被丢弃
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 //节中的数据不会经过缓存
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 //节中的数据不会被交换到磁盘
#define IMAGE_SCN_MEM_SHAEED 0x10000000 //节中的数据将被不同的进程所共享
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 //映射到内存后的页面包含可执行属性
#define IMAGE_SCN_MEM_READ 0x40000000 //映射到内存后的页面包含可读属性
#define IMAGE_SCN_MEM_WRITE 0x80000000 //映射到内存后的页面包含可写属性