PE 节表

节表:总大小占IMAGE_SECTION_HEADER结构体(40字节) * 节的数量(大小取决于节的数量)

结构体为如下:

typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME]; //当前节的名称 , 占8字节
    union {
            DWORD   PhysicalAddress; 
            DWORD   VirtualSize; //在内存中实际占用的大小
    } Misc;
    DWORD   VirtualAddress; //在内存中的偏移地址,该偏移地址加上imagebase就是当前节数据在内存中的真正地址
    DWORD   SizeOfRawData; //当前节表在文件中对齐后的大小
    DWORD   PointerToRawData; //当前节数据在文件中的偏移地址
    DWORD   PointerToRelocations; // 调试相关
    DWORD   PointerToLinenumbers;// 调试相关
    WORD    NumberOfRelocations;// 调试相关
    WORD    NumberOfLinenumbers;// 调试相关
    DWORD   Characteristics; //文件属性,比如该节数据属性是否为可执行属性,都在这里面
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

需要记住的:

VirtualSize:当前节数据内存中文件对齐前的真实尺寸,什么意思呢?假如当前节数据实际大小是0x180,但是在文件中需要进行文件对齐(假设当前文件对齐大小为0x200),所以只能是0x200,所以必须多加0x80,而0x180其实就是这里说的 VirtualSize !

问题:自己也一直没理解在内存中文件对齐大小是什么意思,现在自己就直接把它 当作当前节表在没有进行文件对齐大小之前的大小

VirtualAddress当前节数据内存中的偏移大小,当前节数据在内存中的地址位置就是该 VirtualAddress + ImageBase,数值总是SectionAlignment的值的整数倍

SizeOfRawData:当前节数据在文件中对齐后的大小,那么也就是文件对齐之后的大小!

PointerToRawData当前节数据文件中的偏移地址,当前节数据在文件中的地址位置就是该 PointerToRawData + 0,数值总是FileAlignment的值的整数倍


VirtualSize 可能会比SizeOfRawData 大 也可能会比小

比如定义的全局变量多但是没赋值,就不会存储在文件中,那么在内存中拉伸后的值可能VirtualSize 会比 SizeOfRawData 大!

比如定义的全局变量多并且都赋值,就会存储在文件中,那么在内存中拉伸后的值可能VirtualSize 会比 SizeOfRawData 大!

理解图:


知识点:

代码节的属性一般为60000020H,也就是可执行、可读和"节中包含代码";

数据节的属性 一般为C0000040H,也就是可读、可写和"包含已初始化数据";

而常量节(对应源代码中的.const段)的属性为40000040H,也就是可读 和 "包含已初始化数据";

资源节的属性和常量节的属性一般是相同的。


关于文件属性

标志(属性块) 常用特征值对照表:

[值:00000020h] [IMAGE_SCN_CNT_CODE // Section contains code.(包含可执行代码)]

[值:00000040h] [IMAGE_SCN_CNT_INITIALIZED_DATA // Section contains initialized data.(该块包含已初始化的数据)]

[值:00000080h] [IMAGE_SCN_CNT_UNINITIALIZED_DATA // Section contains uninitialized data.(该块包含未初始化的数据)]

[值:00000200h] [IMAGE_SCN_LNK_INFO // Section contains comments or some other type of information.]

[值:00000800h] [IMAGE_SCN_LNK_REMOVE // Section contents will not become part of image.]

[值:00001000h] [IMAGE_SCN_LNK_COMDAT // Section contents comdat.]

[值:00004000h] [IMAGE_SCN_NO_DEFER_SPEC_EXC // Reset speculative exceptions handling bits in the TLB entries for this section.]

[值:00008000h] [IMAGE_SCN_GPREL // Section content can be accessed relative to GP.]

[值:00500000h] [IMAGE_SCN_ALIGN_16BYTES // Default alignment if no others are specified.]

[值:01000000h] [IMAGE_SCN_LNK_NRELOC_OVFL // Section contains extended relocations.]

[值:02000000h] [IMAGE_SCN_MEM_DISCARDABLE // Section can be discarded.]

[值:04000000h] [IMAGE_SCN_MEM_NOT_CACHED // Section is not cachable.]

[值:08000000h] [IMAGE_SCN_MEM_NOT_PAGED // Section is not pageable.]

[值:10000000h] [IMAGE_SCN_MEM_SHARED // Section is shareable(该块为共享块).]

[值:20000000h] [IMAGE_SCN_MEM_EXECUTE // Section is executable.(该块可执行)]

[值:40000000h] [IMAGE_SCN_MEM_READ // Section is readable.(该块可读)]

[值:80000000h] [IMAGE_SCN_MEM_WRITE // Section is writeable.(该块可写)]

原文地址:https://www.cnblogs.com/zpchcbd/p/12321986.html