PE文件结构解析 Part1 概览
文章来源:https://0xrick.github.io/win-internals/pe2/
简介
该篇文章的目标是,在不涉及细节的情况下,简单介绍一下PE文件格式。
PE文件
PE表示Portable Executable(可移植执行文件),这是一种在Windows操作系统上使用的文件格式,该文件格式基于COFF文件格式(Common Object File Format)。
常见的PE文件除了exe之外,还有动态链接库dll,内核模块srv,控制面板程序cpl,以及很多其他文件。
PE文件是一种特殊的数据结构,这种数据结构持有必要的信息,操作系统加载器能够使用这些信息,加载Exe文件到内存并运行。
结构预览
一个典型的PE文件有着下面这样的结构:
如果我们用PE-bear打开Exe文件,我们也能看到一样的结构。
Dos Header
每个PE文件的前64字节被称为Dos Header,这部分数据让PE文件成为MS-DOS可执行文件。
DOS Stub
Dos Header之后的数据是Dos stub,这部分其实是兼容MS-DOS2.0的可执行文件,它会在DOS模式下打印一个错误提示 “This program cannot be run in DOS mode”
NT Headers
NT Headers 包含3个组成部分:
- Signature: 一个4字节的签名,用于标识当前文件为PE文件。
- File Header: 一个标准的COFF文件头。它包含PE文件相关的信息。
- Optional Header: NT Headers里面最重要的部分。虽然它的名字是Optional Header,这是因为一些文件比如obj文件不包含它,但对于image镜像文件(比如exe文件)来说是必须的。该部分为操作系统加载器(OS loader)提供了重要的信息。
Section Headers
Optional Header之后就是section header table,这是一组Image Section Header。每个section在PE文件中都有一个对应的section header。每个section header都包含对应的section的信息。
Sections
Sections是文件中实际内容存储的地方,这些section会包含程序使用的数据或者资源,以及代码。有很多类型的section,并且它们的作用各不相同。
总结
这篇文章中,我们过了一遍PE文件结构的基础结构,以及简单讨论了一下PE文件的主要部分。接下来的文章我们会更加详细地讨论他们。