【作业内容】
1、手动查,画个PE文件图。
2、编写程序打印节表中的信息。
3、根据节表中的信息,到文件中找到所有的节,观察节的开始位置与大小是否与节表中的描述一致
【PE file_buffer文件图】
【IMAGE_SECTION_HEADER解析】
<winNT.h> 头文件定义如下
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //保存节的名字的数组。
union {
DWORD PhysicalAddress; //该节在文件中的实际大小
DWORD VirtualSize; //该节在内存中占用的大小,节在内存中的大小会因为对齐或填充而增加
} Misc;
DWORD VirtualAddress; //该节在进程的虚拟空间中的起始地址,内存偏移。加载器使用这个地址将节的内容映射到内存中相应的虚拟地址上。
DWORD SizeOfRawData; //该节在PE文件中对齐后的原始数据大小,由于 SizeOfRawData 字段是四舍五入的,而 VirtualSize 字段不是四舍五入的,因此 SizeOfRawData 字段也可能大于 VirtualSize。
DWORD PointerToRawData; //该节在PE文件的实际位置,即相对于文件开始的偏移量。加载器会根据这个偏移量从文件中读取节的内容,并将其加载到内存中。
DWORD PointerToRelocations; //该节的重定位表在文件中的起始位置,如果节中有重定位项,该字段指出重定位表的文件偏移量。数据节可能需要重定位以修正基于位置的引用;没有重定位的映像,该值设为零。(在obj文件中使用,对exe无意义)。
DWORD PointerToLinenumbers; //如果节包含源代码行号信息;;已被弃用,改值应为0
WORD NumberOfRelocations; //该节有多少重定位条目;对于可执行文件,该值设为零。(在obj文件中使用,对exe无意义)。
WORD NumberOfLinenumbers; //该行有多少行