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

相关推荐
一名优秀的码农3 小时前
vulhub系列-10-Misdirection(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
天荒地老笑话么3 小时前
Bridged 下“能上网但内网不可达”:路由/防火墙排查
网络·网络安全
百锦再4 小时前
线程安全的单例模式全方位解读:从原理到最佳实践
java·javascript·安全·spring·单例模式·kafka·tomcat
Mikowoo0074 小时前
VMware_安装 KaLi 操作系统
网络安全
linux_cfan4 小时前
Chrome 彻底封杀 Flash 后,安防监控如何实现 RTSP 流无插件播放?(2026解决方案)
javascript·安全·实时音视频·html5
Aric_Jones4 小时前
博客RBAC权限模型与安全认证全解析
数据库·安全·oracle
枷锁—sha6 小时前
【CTFshow-pwn系列】03_栈溢出【pwn 047】详解:Ret2Libc 之 已知关键地址
网络·安全·网络安全
袁袁袁袁满6 小时前
Linux/Window如何查网络连接/端口/套接字信息?
linux·运维·服务器·网络安全·网络连接
乾元7 小时前
模型提取:黑盒环境下如何窃取对手的 AI 模型参数
网络·人工智能·安全·web安全·机器学习·架构·系统架构