首页
社区
课程
招聘
[原创]PE知识汇总
2020-9-20 18:49 5481

[原创]PE知识汇总

2020-9-20 18:49
5481

PE格式汇总(一)

前言

  • PE文件框架图:
  • PE格式基本概念:
    PE文件使用的是一个平面地址空间,所有的代码和数据都合并在一起,组成了一个很大的结构。文件的内容被分割为不同的区块(又称为段或区段、节等),区块中包括代码和数据,各个区块按页边界对齐。区块没有大小限制,是一个连续结构。每一个快都有自己内存中的一套属性。
  • 基地址
    当PE文件通过Windows加载器载入内存后,内存中的板块被称为模块(Module)。映射文件的起始地址就称为模块句柄(hModule),可以通过模块句柄访问内存中的其他数据结构。这个初始内存地址称为基地址。
  • 虚拟地址
    在Windows系统中,PE文件被系统加载器映射到内存中,每一个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址(Virtual Address\VA)。
  • 相对虚拟地址
    相对虚拟地址(Relative Virtual Address\RVA)是一个简单的,相对于PE文件载入地址的偏移位置,它是一个相对的地址(偏移)

    VA(虚拟地址) = IamgeBase(基地址) + RVA(相对虚拟地址)

  • 文件偏移
    当PE文件在磁盘中时,某个数据位置相对于文件头的偏移量称为文件偏移地址(File Offset)。

PE文件格式

1、MS-DOS头

  • PE文件的开始都是一个DOS头,使PE文件在DOS下也可执行。
  • 结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    IMAGE_DOS_HEADER STRUCT
     
      {
      +0h WORD e_magic            // DOS 可执行标记(0x5A4D"MZ"
      +2h WORD  e_cblp           
      +4h WORD  e_cp
      +6h WORD  e_crlc
      +8h WORD  e_cparhdr
      +0ah WORD  e_minalloc
      +0ch WORD  e_maxalloc
      +0eh WORD  e_ss
      +10h WORD  e_sp
      +12h WORD  e_csum
      +14h WORD  e_ip
      +16h WORD  e_cs
      +18h WORD  e_lfarlc
      +1ah WORD  e_ovno
      +1ch WORD  e_res[4]
      +24h WORD  e_oemid
      +26h WORD  e_oeminfo
      +29h WORD  e_res2[10]
      +3ch DWORD e_lfanew        // 指向PE头
    } IMAGE_DOS_HEADER ENDS
  • 实例:
    图片描述

2、PE文件头

  • PE头(PE Header)紧跟DOS头,是NT映像头(IMAGE_NT_HEADER)的简称。
  • pNTHeader = ImageBase + dosHeader->e_lfanew.
  • 结构:
1
2
3
4
5
typedef struct _IMAGE_NT_HEADERS {
+00h    DWORD Signature; // 固定为 0x00004550  根据小端存储为:"PE.."
+04h    IMAGE_FILE_HEADER FileHeader;
+18h    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
  • 实例:
    图片描述
    图片描述

2.1、

IMAGE_FILE_HEADER

  • IMAGE_FILE_HEADER(映像文件头)结构包含了PE文件的一些基本信息,其中最重要的是包含了IMAGE_OPTIONAL_HEADER32结构的大小。
  • 结构:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct _IMAGE_FILE_HEADER {
    +04h    WORD          Machine;              // 运行平台
    +06h    WORD          NumberOfSections;     // 文件的区块数目
    +08h    DWORD         TimeDateStamp;        // 文件创建日期和时间
    +0Ch    DWORD         PointerToSymbolTable; // 指向符号表(主要用于调试)
    +10h    DWORD         NumberOfSymbols;      // 符号表中符号个数(同上)
    +14h    WORD          SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小
    +16h    WORD          Characteristics;      // 文件属性
    } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  • Machine值对应机器
    图片描述
  • Characteristics值对应文件属性
    图片描述

2.2、

IMAGE_OPTIONAL_FILE

  • IMAGE_OPTIONAL_HEADER(可选映像头)并不像名称那样真的可选,PE文件仅仅靠IMAGE_FILE_HEADER所存在的属性不足以定义完整的PE文件属性。因此IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER文件头连起来才是一个完整的PE文件头结构。
  • 结构:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    typedef struct _IMAGE_OPTIONAL_HEADER {
    WORD                 Magic;
    BYTE                 MajorLinkerVersion;
    BYTE                 MinorLinkerVersion;
    DWORD                SizeOfCode;
    DWORD                SizeOfInitializedData;
    DWORD                SizeOfUninitializedData;
    DWORD                AddressOfEntryPoint;                // 程序执行入口RVA
    DWORD                BaseOfCode;
    DWORD                BaseOfData;
    DWORD                ImageBase;                          // 文件载入内存首选载入地址
    DWORD                SectionAlignment;                   // 载入内存是区块对齐大小
    DWORD                FileAlignment;                      // 磁盘上PE文件区块对齐大小
    WORD                 MajorOperatingSystemVersion;
    WORD                 MinorOperatingSystemVersion;
    WORD                 MajorImageVersion;
    WORD                 MinorImageVersion;
    WORD                 MajorSubsystemVersion;
    WORD                 MinorSubsystemVersion;
    DWORD                Win32VersionValue;
    DWORD                SizeOfImage;
    DWORD                SizeOfHeaders;
    DWORD                CheckSum;
    WORD                 Subsystem;                             // 标识可执行文件所期望的子系统
    WORD                 DllCharacteristics;
    DWORD                SizeOfStackReserve;
    DWORD                SizeOfStackCommit;
    DWORD                SizeOfHeapReserve;
    DWORD                SizeOfHeapCommit;
    DWORD                LoaderFlags;
    DWORD                NumberOfRvaAndSizes;                    // 数据目录项数(16
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
                                                                 //数据目录表
    } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
  • Subsystem 值所对应子系统
    图片描述
    2.2.1:
    IMAGE_DATA_DIRECTORY (数据目录表)
  • 结构:
    1
    2
    3
    4
    typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD VirtualAddress;
    DWORD Size;
    } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  • 数据目录表成员
    图片描述
  • 实例(包括整个IMAGE_NT_HEADER)
    图片描述

3、区块

  • 区块紧跟IMAGE_NT_HEADER,是一个IMAGE_SECTION_HEADER结构数组,每个项包括了它所关联的区块信息。区块数码由IMAGE_NT_HEADER.FileHeader.NumberOfSections指出。

    注:第一个块表的地址=OpHeader(OpotionalHeader位置)+sizeOfOptionalHeader

  • 结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    typedef struct _IMAGE_SECTION_HEADER {
    BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];        // 块名
    union {
      DWORD PhysicalAddress;                    // 物理地址
      DWORD VirtualSize;                        // 指出实际被使用的区块的大小
    } Misc;
    DWORD VirtualAddress;                       // 该块装载到内存中的RVA
    DWORD SizeOfRawData;                        // 该块在磁盘中所占的空间
    DWORD PointerToRawData;                     // 该块在磁盘文件中的偏移
    DWORD PointerToRelocations;                
    DWORD PointerToLinenumbers;
    WORD  NumberOfRelocations;
    WORD  NumberOfLinenumbers;
    DWORD Characteristics;                      // 块属性
    } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
  • 常见区块
    img
    img
    img

  • 实例(以.text块为例)
    图片描述
    图片描述


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2020-9-22 09:14 被tutuj编辑 ,原因: 写错
收藏
点赞4
打赏
分享
最新回复 (3)
雪    币: 4468
活跃值: (1476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qzhiwen 2020-9-20 21:56
2
0
文章绝对精彩。。
雪    币: 997
活跃值: (1518)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
WMBa0 2023-1-27 13:36
3
0
棒棒!
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_iqtxmqux 2023-2-4 21:03
4
0
太牛了
游客
登录 | 注册 方可回帖
返回