• 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.(该块可写)]

  • 相关阅读:
    python RabbitMQ队列/redis
    python 协程
    Python 线程
    Python Socket网络编程
    Python 面向对象编程进阶
    Python 面向对象
    python 模块
    Python 迭代器&生成器&装饰器
    Python 集合操作
    Java多态--构造方法的内部方法多态
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12321986.html
Copyright © 2020-2023  润新知