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
:64Byte
FILE_HEADER
:20Byte
OPTIONAL_HEADER
:SizeOfOptionalHeader
-
计算:
e_lfanew + 4 + 14 + optinalSize
,例子如下节表位置=E0h+4h+14h+E0h=1D8h
一个节表的大小为
36Byte
,每个节表是相邻的