当前位置 博文首页 > KOOKNUT的博客:PE文件学习--Section头部

    KOOKNUT的博客:PE文件学习--Section头部

    作者:[db:作者] 时间:2021-07-03 09:23

    IMAGE_NT_HEADERS后紧跟着节表,节表中节的数量由IMAGE_FILE_HEADER.NumberOfSections来定义,它由许多个节表项IMAGE_SECTION_HEADER组成:

    #define IMAGE_SIZEOF_SHORT_NAME              8
    typedef struct _IMAGE_SECTION_HEADER 
    {
        BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];//8字节
        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;
    

    Name:8字节的大小,ASCII字符串的形式,以’\0’结尾的字符串,所以比如我们要自己写一个节,要注意节区名字的命名,如果超出8个字节,会被’\0’截断。
    Misc:节的数据在没有对齐前的真实尺寸。
    VirtualAddress:节区的RVA。
    SizeOfRawData:节在文件粒度对齐后(磁盘扇区大小0x200)的大小。
    PointerToRawData:节区起始数据在文件中的偏移。
    PointerToRelocations:指向重定位表的指针。
    PointerToLinenumbers:行号表的位置,没怎么用过。
    NumberOfRelocations:重定位表的个数。
    Characteristics:节的属性,有以下属性,图来自《Windows PE权威指南》:
    在这里插入图片描述
    节表之后便是节区了,所有PE文件真正的内容都在节区存放,并且其存放是以节的起始地址来排列(一般text节是第一个节区),不是根据节区的名字的字母次序来排序。后面会细细说各个节区的内容。
    “工欲善其事,必先利其器。”
    参考书籍:
    《Windows PE权威指南》

    cs