PE(二)-节表
节表
节表的结构
- 在
winnt.h中的定义
#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
/**
* 1、Name 8个字节 一般情况下是以"\0"结尾的ASCII吗字符串来标识的名称,内容可以自定义.
*
* 注意:该名称并不遵守必须以"\0"结尾的规律,如果不是以"\0"结尾,系统会截取8个字节的长度进行处理.
*
* 2、Misc 双字 是该节在没有对齐前的真实尺寸,该值可以不准确。
*
* 3、VirtualAddress 节区在内存中的偏移地址。加上ImageBase才是在内存中的真正地址.
*
* 4、SizeOfRawData 节在文件中对齐后的尺寸.
*
* 5、PointerToRawData 节区在文件中的偏移.
*
* 6、PointerToRelocations 在obj文件中使用 对exe无意义
*
* 7、PointerToLinenumbers 行号表的位置 调试的时候使用
*
* 8、NumberOfRelocations 在obj文件中使用 对exe无意义
*
* 9、NumberOfLinenumbers 行号表中行号的数量 调试的时候使用
**/
-
DWORD Characteristics的属性值的意义(简化)数据位 常量符号 置为1时的含义 5 00000020h 节中包含代码 6 00000040h 节中包含已初始化数据 7 00000080h 节中包含未初始化数据 8 00000100h 保留供将来使用 25 02000000h 节中的数据在进程开始后将被丢弃,如 .reloc 26 04000000h 节中的数据不会经过缓存 27 08000000h 节中的数据不会被交换到磁盘 28 10000000h 表示节中的数据将被不同的进程所共享 29 20000000h 映射到内存后的页面包含可执行的属性 30 40000000h 映射到内存后的页面包含可读属性 31 80000000h 映射到内存后的页面包含可写属性 -
节表的个数
有几个节表,就有几个节
节表个数存储在的
FILE_HEADER第二个字段WORD NumberOfSections中 -
图解

节表的位置
- 不管是在磁盘、
FileBuffer还是ImageBuffer中,三者的头大小都是相同的,节表的位置紧接着OPTIONAL_HEADER OPTIONAL_HEADER的大小是可以计算的,再加上DOS_HEADER和FILE_HEADER的大小是固定的,所以可以计算出节表的位置
OPTIONAL_HEADER的大小
-
在
FILE_HEADER中的SizeOfOptionalHeader指定了后面OPTIONAL_HEADER的大小 -
就这个大小而言,32位为
e0h,64位为f0h -
各头文件大小
DOS_HEADER:64ByteFILE_HEADER:20ByteOPTIONAL_HEADER:SizeOfOptionalHeader
-
计算:
e_lfanew + 4 + 14 + optinalSize,例子如下
节表位置=E0h+4h+14h+E0h=1D8h
一个节表的大小为
36Byte,每个节表是相邻的
PE加载的过程


浙公网安备 33010602011771号