PE结构 ----> PE结构基础知识点汇总(与安全开发关联)

目录

[🛡️ 什么是 PE 文件?](#🛡️ 什么是 PE 文件?)

[🔍 推荐 PE 结构查看工具](#🔍 推荐 PE 结构查看工具)

[📜 PE 格式的起源与演化](#📜 PE 格式的起源与演化)

[📍 地址类型:VA、RVA、FOA 详解](#📍 地址类型:VA、RVA、FOA 详解)

[📑 PE 文件头结构深度解析](#📑 PE 文件头结构深度解析)

[🏷️ DOS 头(IMAGE_DOS_HEADER)](#🏷️ DOS 头(IMAGE_DOS_HEADER))

[🔑 NT 头(IMAGE_NT_HEADERS)](#🔑 NT 头(IMAGE_NT_HEADERS))

[🗃️ 区段(Section)详解](#🗃️ 区段(Section)详解)

[📚 数据目录深度扩展](#📚 数据目录深度扩展)

[🔗 导入表(Import Directory)------ 最常被分析的部分](#🔗 导入表(Import Directory)—— 最常被分析的部分)

[🏷️ 导出表(Export Directory)](#🏷️ 导出表(Export Directory))

[🌳 资源目录(Resource Directory)](#🌳 资源目录(Resource Directory))

[🔄 重定位表(Base Relocation)](#🔄 重定位表(Base Relocation))

[🧵 TLS 目录(Thread Local Storage)](#🧵 TLS 目录(Thread Local Storage))

[📏 对齐机制全面解析](#📏 对齐机制全面解析)

[📊 PE 文件结构文本流程图](#📊 PE 文件结构文本流程图)

[🔒 PE 文件在网络安全中的实战应用](#🔒 PE 文件在网络安全中的实战应用)


🛡️ 什么是 PE 文件?

PE(Portable Executable) 是 Windows 操作系统使用的标准可执行文件格式,涵盖 .exe、.dll、.sys、.scr 等多种类型。它将代码、数据、资源、元信息有序组织,便于加载器高效映射到内存并执行。

通俗比喻 PE 文件就像一本结构严谨的"程序说明书":

  • 封面(DOS 头)告诉旧系统"这不是给你的"。

  • 目录(NT 头)告诉 Windows 如何阅读。

  • 正文(区段)存放代码、数据、资源。

真实案例 打开计算器 calc.exe

  1. Windows 加载器读取 DOS 头 → 跳转 NT 头。

  2. 分配虚拟内存,按区段映射 .text、.data 等。

  3. 解析导入表,加载 user32.dll、kernel32.dll。

  4. 跳转入口点,显示界面。

若病毒修改入口点为恶意代码,则计算器启动时会偷偷联网窃取数据。

在网络安全中的核心价值

  • 恶意软件静态/动态分析基础

  • 漏洞利用与防御研究对象

  • 逆向工程与取证关键载体


🔍 推荐 PE 结构查看工具

工具 主要功能 适合人群 备注
CFF Explorer 最全面的解析与编辑 中高级用户 界面友好,支持重签名、重建
010 Editor + PE模板 精确到字节的模板解析 专业逆向人员 可编辑任意字段
LoadPE / PEView 中文界面,快速查看头与区段 初学者 轻量便携
PE-bear 现代开源工具,支持 PE32+ 安全研究员 跨平台,活跃维护
Dependency Walker (Depends) 依赖树分析 所有人 64 位需用新版 Depends22
Detect It Easy (DIE) 快速检测加壳、加密、语言 初步筛查 比 PEiD 更现代
x64dbg + ScyllaHide 动态脱壳与导入表重建 高级分析 配合插件使用

底层原理:所有工具都遵循 Microsoft 官方 PE/COFF 规范(最新版本见 docs.microsoft.com),将二进制流按固定偏移解析为结构化字段。


📜 PE 格式的起源与演化

时间 里程碑事件 关键变化
1993 Windows NT 3.1 首次引入 PE,基于 COFF 改进
1995-2001 Win95 → WinXP 确立 32 位 PE32 标准
2007 Windows Vista 引入 PE32+(64 位),ASLR 支持
2015+ Windows 10/11 CFG、签名强制、资源优化

为何经久不衰?

  1. 向下兼容(保留 DOS 头)

  2. 模块化设计(DLL 共享)

  3. 灵活地址重定位(支持 ASLR)

  4. 丰富数据目录(易扩展新特性)

安全案例 早期勒索病毒常伪造 TimeDateStamp 为 1990-2000 年,分析师通过时间戳异常追溯家族。


📍 地址类型:VA、RVA、FOA 详解

类型 全称 含义 典型值范围 转换关系
VA Virtual Address 进程内存中的绝对地址 0x00400000 ~ VA = ImageBase + RVA
RVA Relative Virtual Address 相对于映像基址的偏移 0x1000、0x2000... RVA = VA - ImageBase
FOA File Offset Address 文件中的物理偏移 0x400、0xE00... FOA = RVA - VirtualAddress + PointerToRawData

转换代码示例(美化注释版)

cpp 复制代码
// 包含必要头文件
#include <windows.h>
#include <stdio.h>
​
// RVA 转 FOA 函数
DWORD RvaToFoa(DWORD rva, IMAGE_SECTION_HEADER* sections, WORD numSections)
{
    // 遍历所有区段
    for (WORD i = 0; i < numSections; i++)
    {
        // 计算区段内存范围
        DWORD secStart = sections[i].VirtualAddress;
        DWORD secEnd   = secStart + sections[i].SizeOfRawData;
​
        // 判断 RVA 是否落在当前区段
        if (rva >= secStart && rva < secEnd)
        {
            // 计算文件偏移并返回
            return rva - secStart + sections[i].PointerToRawData;
        }
    }
    // 未找到返回 0
    return 0;
}

安全应用

  • 静态分析用 FOA 提取壳代码

  • 内存取证用 VA 定位注入的 shellcode

  • 绕过 ASLR 需找到无重定位信息泄露的模块


📑 PE 文件头结构深度解析

🏷️ DOS 头(IMAGE_DOS_HEADER)
  • 固定前两个字节:MZ(0x5A4D)

  • 关键字段:e_lfanew → NT 头偏移(通常 0xE8 或 0xF0)

恶意常见手法:在 DOS Stub 中嵌入"This program cannot be run in DOS mode"后追加真实恶意代码。

🔑 NT 头(IMAGE_NT_HEADERS)

包含三部分:

  1. 签名 PE\0\0

  2. 文件头(IMAGE_FILE_HEADER)

  3. 可选头(IMAGE_OPTIONAL_HEADER32/64)

关键字段速览

字段 含义 安全关注点
Machine CPU 架构(0x014C=x86, 0x8664=x64) 伪造架构混淆分析
NumberOfSections 区段数量 异常多(如 >50)常为加壳
TimeDateStamp 编译时间 伪造隐藏真实编译时间
Characteristics 文件属性(EXE=0x0002, DLL=0x2000) 判断类型
AddressOfEntryPoint 入口点 RVA 常被病毒修改为恶意代码
ImageBase 建议加载基址 非标准值可能绕过 ASLR 检查
DataDirectory[16] 16 个重要数据目录 导入/导出/资源/重定位等

🗃️ 区段(Section)详解

常见区段与权限

区段名 典型权限标志 内容 安全关注点
.text 0x60000020 (RX) 可执行代码 壳代码、恶意逻辑
.data 0xC0000040 (RW) 已初始化数据 配置表、加密密钥
.bss 0xC0000040 未初始化数据(不占文件) ---
.rdata 0x40000040 (R) 只读数据(常量、导入表) ---
.rsrc 0x40000040 (R) 资源(图标、对话框) 常隐藏恶意载荷
.reloc 0x42000040 (R) 重定位表 无此表 = 不支持 ASLR
.idata 0x40000040 导入表 API 钩子目标

异常区段特征(恶意软件常用)

  • 名称诡异:UPX0、stub、.aspack

  • 权限异常:可写可执行(0xE0000020)

  • 熵值极高(>7.9)


📚 数据目录深度扩展

🔗 导入表(Import Directory)------ 最常被分析的部分

结构链 OriginalFirstThunk(INT)→ Name → FirstThunk(IAT)

加载流程

  1. 加载器读取每个 IMAGE_IMPORT_DESCRIPTOR

  2. 根据 Name 加载对应 DLL

  3. 按 INT 表中的 Hint/Name 查找函数地址

  4. 填入 IAT 供程序直接调用

安全案例 很多恶意软件会擦除 INT 表,只保留 IAT(延迟导入或手动 GetProcAddress),增加静态分析难度。

🏷️ 导出表(Export Directory)

DLL 专属,用于暴露函数给其他模块调用。

常见恶意利用

  • 导出转发(Forwarder)指向另一恶意 DLL

  • 伪造导出函数迷惑分析工具

🌳 资源目录(Resource Directory)

三层树结构:类型 → 名称 → 语言 常用于隐藏图标、伪装对话框、存储加密载荷。

提取技巧 使用 Resource Hacker 或 010 Editor 模板快速查看。

🔄 重定位表(Base Relocation)

ASLR 必需。无此表说明固定基址,易被利用。

🧵 TLS 目录(Thread Local Storage)

程序启动前执行 TLS 回调,常被病毒用于反调试、提前解密。


📏 对齐机制全面解析

对齐类型 典型值 目的 恶意软件常见异常
FileAlignment 0x200 (512字节) 匹配磁盘扇区 改为 0x100、0x1000 隐藏数据
SectionAlignment 0x1000 (4KB) 匹配内存页面 改为 0x800、0x200 绕过检查
资源对齐 4 字节 CPU 访问效率 不对齐隐藏额外数据

检测技巧 CFF Explorer → Rebuilder → 查看是否出现 "Alignment warning"


📊 PE 文件结构文本流程图

复制代码
PE 文件
├── DOS 头 (64 字节)
│   ├── e_magic = 'MZ'
│   └── e_lfanew → NT 头偏移
│
├── NT 头
│   ├── 签名 'PE\0\0'
│   ├── 文件头
│   │   ├── Machine
│   │   ├── NumberOfSections
│   │   └── TimeDateStamp
│   └── 可选头
│       ├── Magic (0x10B=PE32, 0x20B=PE32+)
│       ├── ImageBase
│       ├── AddressOfEntryPoint
│       ├── SectionAlignment / FileAlignment
│       └── DataDirectory[16]
│           ├── [0] 导出表
│           ├── [1] 导入表 → INT & IAT
│           ├── [2] 资源目录 → 类型/名/语言树
│           ├── [5] 重定位表 → ASLR 支持
│           └── [9] TLS 回调 → 提前执行代码
│
└── 区段表 (40 字节 × N)
    ├── .text    (代码 RX)
    ├── .rdata   (只读数据 R)
    ├── .data    (初始化数据 RW)
    ├── .idata   (导入表)
    └── .rsrc    (资源)

🔒 PE 文件在网络安全中的实战应用

  1. 加壳识别与脱壳

    • 工具:Detect It Easy → 识别 UPX、ASPack、Themida

    • 动态脱壳:x64dbg + ScyllaHide + TitanHide 反反调试

  2. 恶意行为快速判断特征

    • 区段熵 > 7.9

    • 异常权限区段(可写可执行)

    • 缺失 .reloc(不支持 ASLR)

    • TLS 回调存在

    • 导入表仅含 LoadLibrary/GetProcAddress(延迟导入)

  3. 取证关键字段

    • TimeDateStamp:编译时间

    • Rich Header:编译器版本指纹

    • 数字签名:Code Signing Certificate

  4. 自动化解析脚本建议 可使用 Python + pefile 库快速提取关键信息。


结语 PE 格式是 Windows 生态的基石,也是网络安全攻防的核心战场。掌握其结构与原理,不仅能快速判断文件良性与否,更能在逆向、取证、漏洞研究中游刃有余。

相关推荐
用户962377954484 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主5 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954487 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机7 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机7 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954488 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star8 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954488 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher9 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行12 天前
网络安全总结
安全·web安全