The Section Table
这个字段位于PE 表头和真正的 section 资料之间,其中内含 image 的
每一个sections 的信息。
section table 的每一笔资料贮存了一个地址,
在那里,文件的原始资料被映像到内存。虽然sections 类似 32 位的
segments ,事实上它们不是一个个的 segments ,而是行程虚拟地址空间中
一块内存范围。
而且PE中的大部分重要的code 或 data 都会被存放在一个section 之中。也就
是说程序或作业系统所需的任何 code 或 data 都可能有它自己的 section 。
对于相比之下的NE文件老说就不是这样,因为有许多code或data都未被重视然
后存储在NE表头的边缘
IMAGE_SECTION_HEADER 的结构组成如下
1. BYTE Name[IMAGE_SIZEOF_SHORT_NAME]
表示 section 名称,例如 ".text"。在C++中#pragma code_seg 或
#pragma data_seg 方式可以创建自己的数据段,这一点曾经在dll中尝试过
并且还设置了共享的属性来使多个进程使用!
2. union {DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
在 EXE 中它代表 code section 或 data section 的虚拟大小,这是在它
们被调整之前的大小,而还有的SizeOfRawData 字段则是调整后的大小。
3. DWORD VirtualAddress
代表加载器应该将 section 映像过去的 RVA 位置。为了计算section 的真
正起始地址,你必须将此值再加上基地址。微软的工具把第一个 section 的
此一字段设为 0x1000 。
4.DWORD SizeOfRawData
这个字段代表 section 大小被调整后的值。所谓调整就是将所有section的大
小扩展成为file-alignment的整数倍。当然要是最接近的整数倍。
5. DWORD PointerToRawData
这是以文件起头为基准的偏移值,section 的原始资料可以在该处寻获。相对
来说比较重要。
6.DWORD PointerToRelocations
在 EXEs 中,这个栏位(以及下一字段)没有意义,总是为 0 。
7.DWORD PointerToLinenumbers
行号表的偏移值,与CodeView 除错有关,行号信息被收集放在文件的最尾端
8. WORD NumberOfRelocations
重定位项目个数,只用于OBJ
9.WORD NumberOfLinenumbers
由 PointerToLinenumbers 指向的行号表格中的行号个数。
10. DWORD Characteristics
这个字段是一组旗标值,用来表示 section 中的属性,可读可写共享等
等。。。