• PE文件详解三:节表(区块表)IMAGE_SECTION_HEADER结


    节表(区块表):
    PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来 描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的。全部有效结构的最后以一个空的IMAGE_SECTION_HEADER结构作为 结束,所以节表中总的IMAGE_SECTION_HEADER结构数量等于节的数量加一。节表总是被存放在紧接在PE文件头的地方。
    另外,节表中 IMAGE_SECTION_HEADER 结构的总数总是由PE文件头 IMAGE_NT_HEADERS 结构中的 FileHeader.NumberOfSections 字段来指定的。

    此结构体共占40个字节

    typedef struct _IMAGE_SECTION_HEADER 
    
    {
    +0h BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 节表名称,如“.text” 
    //IMAGE_SIZEOF_SHORT_NAME=8
    union
    +8h {
    DWORD PhysicalAddress; // 物理地址
    DWORD VirtualSize; // 真实长度,这两个值是一个联合结构,可以使用其中的任何一个,一
    // 般是取后一个
    } Misc;
    +ch DWORD VirtualAddress; // 节区的 RVA 地址
    +10h DWORD SizeOfRawData; // 在文件中对齐后的尺寸
    +14h DWORD PointerToRawData; // 在文件中的偏移量
    +18h DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移
    +1ch DWORD PointerToLinenumbers; // 行号表的偏移(供调试使用地)
    +1eh WORD NumberOfRelocations; // 在OBJ文件中使用,重定位项数目
    +20h WORD NumberOfLinenumbers; // 行号表中行号的数目
    +24h DWORD Characteristics; // 节属性如可读,可写,可执行等
    } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

    Name: 区块名。这是一个由8位的ASCII 码名,用来定义区块的名称。多数区块名都习惯性以一个“.”作为开头(例如:.text),这个“.” 实际上是不是必须的。值得我们注意的是,如果区块名超过 8 个字节,则没有最后的终止标志“NULL” 字节。并且前边带有一个“$” 的区块名字会从连接器那里得到特殊的待遇,前边带有“$” 的相同名字的区块在载入时候将会被合并,在合并之后的区块中,他们是按照“$” 后边的字符的字母顺序进行合并的。
    另外每个区块的名称都是唯一的,不能有同名的两个区块。但事实上节的名称不代表任何含义,他的存在仅仅是为了正 规统一编程的时候方便程序员查看方便而设置的一个标记而已。所以将包含代码的区块命名为“.Data” 或者说将包含数据的区块命名为“.Code” 都是合法的。当我们要从PE 文件中读取需要的区块时候,不能以区块的名称作为定位的标准和依据,正确的方法是按照 IMAGE_OPTIONAL_HEADER32 结构中的数据目录字段结合进行定位。

    Virtual Size:该区块表对应的区块的大小,这是区块的数据在没有进行对齐处理前的实际大小。

    Virtual Address:该区块装载到内存中的RVA 地址。这个地址是按照内存页来对齐的,因此它的数值总是 SectionAlignment 的值的整数倍。在Microsoft 工具中,第一个快的默认 RVA 总为1000h。在OBJ 中,该字段没有意义地,并被设为0。

    SizeOfRawData:该区块在磁盘中所占的大小。在可执行文件中,该字段是已经被FileAlignment 潜规则处理过的长度。

    PointerToRawData:该区块在磁盘中的偏移。这个数值是从文件头开始算起的偏移量哦。

    PointerToRelocations:这哥们在EXE文件中没有意义,在OBJ 文件中,表示本区块重定位信息的偏移值。(在OBJ 文件中如果不是零,它会指向一个IMAGE_RELOCATION 结构的数组)

    PointerToLinenumbers:行号表在文件中的偏移值,文件的调试信息,于我们没用,鸡肋。

    NumberOfRelocations:这哥们在EXE文件中也没有意义,在OBJ 文件中,是本区块在重定位表中的重定位数目来着。

    NumberOfLinenumbers:该区块在行号表中的行号数目,鸡肋。

    Characteristics:该区块的属性。该字段是按位来指出区块的属性(如代码/数据/可读/可写等)的标志。

    IMAGE_SCN_CNT_CODE
    0x00000020

     

    The section contains executable code.

    包含代码,常与 0x10000000一起设置。

     

    IMAGE_SCN_CNT_INITIALIZED_DATA
    0x00000040

     

    The section contains initialized data.

    该区块包含以初始化的数据。

     

    IMAGE_SCN_CNT_UNINITIALIZED_DATA
    0x00000080

     

    The section contains uninitialized data.

    该区块包含未初始化的数据。

     

    IMAGE_SCN_MEM_DISCARDABLE
    0x02000000

    The section can be discarded as needed.
    该区块可被丢弃,因为当它一旦被装入后,
    进程就不在需要它了,典型的如重定位区块。

    IMAGE_SCN_MEM_SHARED
    0x10000000
    The section can be shared in memory.
    该区块为共享区块。

    IMAGE_SCN_MEM_EXECUTE
    0x20000000

    The section can be executed as code.
    该区块可以执行。通常当0x00000020被设置
    时候,该标志也被设置。

    IMAGE_SCN_MEM_READ
    0x40000000

    The section can be read.
    该区块可读,可执行文件中的区块总是设置该
    标志。

    IMAGE_SCN_MEM_WRITE
    0x80000000
    The section can be written to.
    该区块可写。


    以下给大家列举出最常用的一些属性值:
    具体内容可以参考MSDN在线文档:http://msdn.microsoft.com/en-us/library/ms680341(v=vs.85).aspx

  • 相关阅读:
    PHPStorm下XDebug配置
    HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)
    VC++深入详解-第五章学习心得
    nginx access log logrotate配置
    判断变量是否存在(python)
    一步一步学android之布局管理器——LinearLayout
    向前辈致敬 strspn
    poj 1087 (最大流)
    cocos2d-x Touch 事件应用的一个例子
    [置顶] C#扩展方法 扩你所需
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2857180.html
Copyright © 2020-2023  润新知