如果你写过 Windows 程序,却说不清 .exe 从双击到跑起来中间被系统做了什么;如果你用过 Dependency Walker 或 CFF Explorer,却对着一堆 RVA、节表、导入表发懵;如果你在逆向、安全分析、壳与免杀、甚至调试崩溃 dump 时总卡在「看不懂文件结构」这一步——这门课要补的就是这个缺口。

先确认你缺的是哪一块

PE 不是一个孤立的格式,它是 Windows 加载器、链接器、调试器、反汇编工具共同遵守的一份约定。很多人不是没学过,而是学得零碎:知道 DOS 头后面跟着一个 e_lfanew,却不知道它为什么要这么设计;背过可选头里的 ImageBase 和 SectionAlignment,却不知道它们对不上时系统会怎么处理。

基础部分要解决的,是让你把这份约定从「背字段」变成「看结构能推行为」。判断标准很简单:给你一个任意编译出来的可执行文件,你能自己算出它在内存里长什么样,而不是依赖工具面板上现成的数字。

这门课会逐个拆开的结构

内容围绕 PE 的骨架展开:DOS 头与 NT 头如何衔接,文件头里的机器类型和节数量意味着什么,可选头中哪些字段决定加载行为、哪些只是给调试器看的,以及数据目录表里每一项指向哪个结构。

重点会落在节表(SECTION HEADER)与各种数据目录上。节不是随便切的,对齐、属性、虚拟大小与原始大小的差异,直接关系到文件在磁盘上和加载后为什么长得不一样。导入表、导出表、重定位表、资源目录这几块,是后续做逆向或分析时出现频率最高的地方,课程会把它们的组织方式和遍历方法讲清楚。

  • RVA 与文件偏移的换算究竟怎么进行,什么时候不能用简单减法
  • 导入表的双层结构:描述符数组和 OriginalFirstThunk 各自的作用
  • 重定位表在 ASLR 下如何工作,为什么 DLL 需要而早期 EXE 不需要
  • 导出表的名称、序号、地址三张表之间如何互相索引

配套要看、要动手的部分

只看结构图很容易产生「我懂了」的错觉。建议边看边做三件事:用十六进制编辑器打开一个自己编译的简单程序,手动定位 e_lfanew 并顺着走下去;对照一个真实 DLL,把它的导入函数全部列出来,再和依赖查看工具的结果核对;找一个关闭了优化、符号齐全的小程序作为样本,反复验证每个字段的值。

练习不必追求复杂样本。基础阶段用一个几十 KB 的控制台程序,比拿一个加过壳的商业软件更有价值——后者会把结构改得面目全非,你分不清哪些是 PE 本身的规则,哪些是壳的痕迹。

看完应该能回答的问题

学完之后,下面这些问题不该再需要临时搜索:

  • 为什么修改了节区大小,程序有时能跑有时直接报错?
  • 导入表中一个函数只有序号没有名字,加载器怎么找到它?
  • ImageBase 与实际加载地址不一致时,系统做了哪些补救?
  • 一个节既可以读又可以写还可以执行,会带来什么后果?

这些问题答得上来,说明你已经能在脑子里重建 PE 的加载过程,而不是停留在记忆字段名称。基础打牢之后,再去看加壳、脱壳、注入、Hook 这些话题,你会发现自己能分辨哪些操作是在利用 PE 规则、哪些是在绕过它。缺什么补什么,这一块没补上,后面的内容都会变成死记硬背。

windows PE 指南(基础部分)

课程详情

课程标题:Windows PE 指南(基础部分)

本课程深入讲解了PE文件的格式,适合有一定Windows编程经验和基础的学员。

  • 核心介绍:全面解析Windows PE文件结构,帮助学员深入理解PE文件的工作原理。
  • 适合人群:具备一定Windows编程基础,希望深入了解PE文件格式的学员。
  • 学习收获:掌握PE文件格式,提升在Windows系统开发中的技能。
  • 课程亮点:
    • 系统讲解PE文件格式,理论与实践相结合。
    • 深入浅出,适合不同基础的学员。
    • 丰富案例,提高学员实际操作能力。

课程目录

01 PE基础(X64)
  01 查找软件注册码
  02 64位汇编和编译连接
  03 PE和COFF文件布局简介
  04 COFF头
  05 符号表一
  06 字符串和重定位
  07 COFF文件概览
  08 PE文件头
  09 PE文件布局和装入后内存布局
  10 PE重定位
  11 导出节
  12 导入节
  13 导入表的使用和dll重定向
  14 再论重定位和导入-Message函数历程
  15 延迟导入
  16 64位的变量对齐和一些约定
  17 调用约定
  18 栈的使用
  19 结构化异常处理概述
  20 32位结构化异常处理
  21 C语言的结构化异常处理
  22 32位结构化处理与PE以及函数回退
  23 64位函数的跳跃回退和相关数据结构
  24 64位函数跳跃回退的数据结构
  25 上一节课的纠错
  26 函数结构化异常处理的数据结构
  27 64位结构化异常处理跟踪
  28 静态线程本地存储
  29 资源节