WindowsPE文件格式资料
PE文件格式详解

PE文件格式详解(一)基础知识什么是PE文件格式:我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Window系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。
为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC 文件中的文件内容等)之外还存在其他一些重要的信息。
这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。
Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。
那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。
例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。
在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。
在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。
程序是如何运行起来的:一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑源文件;然后使用编译器编译程目标文件OBJ,这里面涉及到编译原理的知识;连接器把OBJ文件和其他一些库文件和资源文件连接起来生成EXE文件,这里面涉及到不同的连接器的知识,连接器根据OS的需要生成EXE文件保存着磁盘上;当我们运行EXE文件的时候有Window的加载器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪些重要信息。
PE文件格式

WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
么正确的开始地址是0x401560。如果可执行程序调入0x100000处,则开始地址为0x101560。
因为PE文件的每一个段不必按同样的边界对齐方式调入,因此RVA地址的计算变得比较复
杂。例如,在文件中每一个段往往按512个字节的方式对齐,而在内存中可能以4096字节的方
式对齐。这方面的介绍可见下面的“SectionAlignment”、“FileAlignment”。举个例子,
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
三、文件头(File Header)
通过DOS头,你可以找到一个叫做IMAGE_FILE_HEADER的结构,如下;下面我分别介绍一
下。
typedef struct _IMAGE_FILE_HEADER {
中只有大约100个字节的代码,只输出一个诸如“this program needs windows NT ”之类的
信息。
你可以通过一个叫做IMAGE_DOS_HEADER的结构来识别一个合法的DOS头。这个结构的头两
个字节一定是“MZ”(#define IMAGE_DOS_SIGNATURE "MZ")。怎么才能找到PE开始的标志呢
WindowsPE文件格式

WindowsPE⽂件格式在PE⽂件头之前理论Windows的PE(Portable Executable)⽂件有两个头,⼀个是是Windows头,⼀个是DOS头。
在⽂件的最开始会有⼀段DOS的EXE⽂件头,来说明这个程序不可以在DOS环境下运⾏。
我们需要在DOS头+3Ch处,会有⼀个4字节的指针指向windows头。
根据+3Ch处的值,定位到Windows⽂件头可以看到"PE"两个字节,Windows头就从此处开始。
这也就是Windows EXE⽂件经常被称为PE⽂件的原因。
实践1. 在xp环境下,⽤QuickView打开⼀个EXE⽂件,观察其头部。
在00h处有两个字节4D 5A表⽰这是⼀个DOS头。
在4Eh处,有⼀个字符串This program cannot be run in DOS mode. 表明这不是⼀个DOS⽂件在3C处,有⼀个四字节指针,其值为000000D0h,颜⾊标黄,指向windows头2. 查看⽂件地址D0处的值可以看到此处的两个字节为50 45即“PE”,表⽰这个EXE⽂件是⼀个PE⽂件,从这两个字节开始才是PE的⽂件头。
PE⽂件头背景知识要了解PE⽂件头的具体内容,我们需要对Windows的内存管理,⽂件存储有⼀定的了解。
接下来做简要的说明,想要了解更详细的内容可以去学习操作系统的相关知识。
Windows通过分段以及分页两种机制管理内存和实现进程的隔离及保护。
以下说明会涉及到⼀些寄存器和⽐较抽象的概念,不懂也没有关系。
只需要知道结论,*⼀个进程的虚拟地址会经过⼀些转换成为真正的物理地址. *进程之间的虚拟地址可以相同,但相同的虚拟地址会转化成不同的物理地址。
在Windows系统中,为了向下兼容,保留了分段(section)的的机制,但是CS,DS,SS这些段地址在GDT表中的值全部为0,所以经过分段后的逻辑地址(logical address)与线性地址(linear address)是完全⼀致的,在此处不⽤过多理会。
win11pe分区格式

在Windows 11 PE中,分区格式的选择对系统的稳定性和性能有很大的影响。
常见的分区格式包括FAT32、NTFS和EXT4等。
首先,FAT32格式在PE系统上通常是一个不错的选择。
它是一种文件分配表格式,具有较小的磁盘空间要求,并且操作简单。
然而,FAT32格式在处理大文件和大型硬盘驱动器时可能会遇到问题,因为它只支持最大约为4GB的文件。
对于更高级的用户,NTFS格式是一个更好的选择,因为它提供了更高的文件管理能力和安全性。
在PE系统中,使用NTFS格式可以确保数据的安全性和稳定性,并且它对大文件和大型硬盘驱动器的支持也更好。
然而,转换为NTFS格式可能会涉及一些文件重命名或复制操作,因此需要注意备份重要数据。
此外,考虑到Windows 11 PE的操作系统需求,建议选择合适的分区大小。
通常,PE系统需要至少1GB的可用空间来运行,以确保系统的稳定性和性能。
对于更大的硬盘驱动器,可以考虑使用分区工具进行分区,以便为PE系统分配足够的空间。
在选择分区格式和分区大小后,建议进行磁盘分区测试,以确保PE系统能够正常运行并满足需求。
在测试过程中,可以尝试运行不同的软件和应用程序,以检查系统的稳定性和性能。
如果发现问题,可以及时调整分区格式或分区大小,以确保系统的正常运行。
总之,在Windows 11 PE中,选择合适的分区格式和大小非常重要。
FAT32格式适合小文件和简单的需求,而NTFS格式提供了更高的文件管理能力和安全性。
根据需求和可用空间,选择合适的分区大小也很关键。
经过测试和调整后,Windows 11 PE将能够正常运行并满足您的需求。
C2-2 PE文件格式之一

8
3 PE文件格式总体结构
1.DOS MZ header 2.DOS stub 3.PE header 4.Section table 5-1 Section 1 5-2 Section 2 Section ... 5.3 Section n
15
(1) MS-DOS MZ文件头(0x40)+ (2)DOS Stub
29
(4)节表
节表,是紧挨着 PE header 的一个结构数组。 每一个节均对应一个节表项: 节名; 节在文件和内存中的开始地址; 长度; 节属性等。
30
test.exe的节表
31
Characteristics-节属性
0x00000020? 这个块包含代码。置位 0x00000040? 这个块包含已初始化的数据。 0x00000080? 这个块包含未初始化的数据(如 .bss 块) 0x00000200? 这个块包含注释或其它的信息。 0x00000800? 这个块的内容不应放进最终的EXE文件中。 0x02000000? 这个块可以被丢弃,因为一旦它被载入,其进程就不需要它。最通常的可丢弃 块是基本重定位块( .reloc )。 0x10000000? 这个块是可共享的。 0x20000000? 这个块是可执行的。 0x40000000? 这个块是可读的。 0x80000000? 这个块是可写的。
38
.data节
39
4.3未初始化的数据节
节名称一般叫.bbs。
这个节里放有未初始化的全局变量和静态变量。 例如“static int k;”
40
6
2 PE文件格式与恶意软件的关系
何为文件感染?[或控制权获取]
使目标PE文件具备[或启动]病毒功能[或目标程序] 但不破坏目标PE文件原有功能和外在形态(如图标)等
PE文件格式(内容详细)

简介
在DOS环境下有四种基本的可执行文件格式
批处理文件,以.BAT结尾的文件
设备驱动文件,是以.SYS结尾的文件,如CONFIG.SYS
COM文件,是以.COM结尾的纯代码文件
• 没有文件头部分,缺省情况下总是从0x100H处开始执行, 没有重定位项,所有代码和数据必须控制在64K以内
在Win32位平台可执行文件格式:可移植的可执行文件 (Portable Executable File)格式,即PE格式。MZ文件头 之后是一个以“PE”开始的文件头
安装在硬盘上的程序没运行-静态 加载到内存-动态
EXE文件的格式
MZ文件格式-Mark Zbikowski
.EXE文件由三部分构成:文件头、重定位表和二进制代码 允许代码、数据、堆栈分别处于不同的段,每一段都可以是64KB.
EXE文件的格式
PE文件格式
一般来说,病毒往往先于HOST程序获得控制权。运行 Win32病毒的一般流程示意如下:
①用户点击或系统自动运行HOST程序; ②装载HOST程序到内存;
③通过PE文件中的AddressOfEntryPoint+ImageBase,
定位第一条语句的位置(程序入口); ④从第一条语句开始执行(这时执行的其实是病毒代码); ⑤病毒主体代码执行完毕,将控制权交给HOST程序原来的
病毒通过“MZ”、“PE”这两个标志,初步判断当前程序 是否是目标文件——PE文件。如果要精确校验指定文件是 否为一有效PE文件,则可以检验PE文件格式里的各个数 据结构,或者仅校验一些关键数据结构。大多数情况下, 没有必要校验文件里的每一个数据结构,只要一些关键数 据结构有效,就可以认为是有效的PE文件
PE的意思就是Portable Executable(可移植、可执 行),它是Win32可执行文件的标准格式
PE文件详解1——PE文件头部解析

PE⽂件详解1——PE⽂件头部解析参考书籍:《WindowsPE⽂件权威指南》MSDN中winnt.h是PE⽂件定义的最终决定者。
EXE⽂件与DLL⽂件之间的区别完全是语义上的,⼆者PE结构完全相同。
唯⼀区别⽤⼀个字段标⽰处这个⽂件是exe还是dll。
许多DLL扩展,如OCX控件,控制⾯板等都是DLL,它们有⼀样的实体。
64位的Windows只是对PE格式做了⼀些简单的修饰,新格式叫PE32+。
没有新的结构加进去,其余的改变只是简单地将以前的32位字段扩展为64位字段。
1.PE⽂件基本结构:PE⽂件的头分为DOS头、NT头、节头。
注意,这是本⼈的分法。
这样分法会更加合理,更易理解。
因为这三个部分正好构成SizeOfHeaders所指的范围,所以将它们合为“头”。
2.⽂件头2.1 DOS头⽤记事本打开任何⼀个镜像⽂件,其头2个字节必为字符串“MZ”,这是Mark Zbikowski的姓名缩写,他是最初的MS-DOS设计者之⼀。
然后是⼀些在MS-DOS下的⼀些参数,这些参数是在MS-DOS下运⾏该程序时要⽤到的。
在这些参数的末尾也就是⽂件的偏移0x3C(第60字节)处是是⼀个4字节的PE⽂件签名的偏移地址。
该地址有⼀个专⽤名称叫做“E_lfanew”。
这个签名是“PE00”(字母“P”和“E”后跟着两个空字节)。
紧跟着E_lfanew的是⼀个MS-DOS程序。
那是⼀个运⾏于MS-DOS下的合法应⽤程序。
当可执⾏⽂件(⼀般指exe、com⽂件)运⾏于MS-DOS下时,这个程序显⽰“This program cannot be run in DOS mode(此程序不能在DOS模式下运⾏)”这条消息。
⽤户也可以⾃⼰更改该程序,有些还原软件就是这么⼲的。
同时,有些程序既能运⾏于DOS⼜能运⾏于Windows下就是这个原因。
Notepad.exe整个DOS头⼤⼩为224个字节,⼤部分不能在DOS下运⾏的Win32⽂件都是这个值。
PE文件结构与ELF文件结构

一、PE文件结构PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL),Portable 是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的,当然CPU不一样了,CPU指令的二进制编码是不一样的。
只是文件中各种东西的布局是一样的。
在下面关于结构的定义中,WORD 表示变量大小为2个字节,DWORD表示变量大小是4个字节。
1.1 PE文件的结构PE文件有着固定的结构,分为五个部分,如下:1:DOS MZ Header(DOS文件头) 一个IMAGE_DOS_HEADER结构,大小为64字节。
2:DOS Stub(DOS加载模块) 没有固定大小。
3:PE Header(PE文件头)一个IMAGE_NT_HEADERS结构,大小为248字节。
4:Section Table(节表)一个IMAGE_SECTION_HEADER结构数组,数组大小依据节而定,如果PE文件有5个节,则数组大小为5。
5:Sections(节或段)没有固定大小,可以有多个节。
1.2 DOS文件头和DOS加载模块PE文件的一二部分完全是为了程序能在DOS运行下时给出一个提示。
IMAGE_DOS_HEADER结构的定义如下:Typedef struct IMAGE_DOS_HEADER{WORD e_magic; // 魔术数字WORD e_cblp; // 文件最后页的字节数WORD e_cp; // 文件页数WORD e_crlc; // 重定义元素个数WORD e_cparhdr; // 头部尺寸,以段落为单位WORD e_minalloc; // 所需的最小附加段WORD e_maxalloc; // 所需的最大附加段WORD e_ss; // 初始的SS值(相对偏移量)WORD e_sp; // 初始的SP值WORD e_csum; // 校验和WORD e_ip; // 初始的IP值WORD e_cs; // 初始的CS值(相对偏移量)WORD e_lfarlc; // 重分配表文件地址WORD e_ovno; // 覆盖号WORD e_res[4]; // 保留字WORD e_oemid; // OEM标识符(相对e_oeminfo)WORD e_oeminfo; // OEM信息WORD e_res2[10]; // 保留字LONG e_lfanew; // 新exe头部的文件地址} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;DOS文件头和DOS加载模块在 Windows下几乎已经没有什么作用了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DOS头
MZ文件头 :DOS MZ HEADER DOS插桩程序 :DOS Stub PE文件标志 :“ PE\0\0”
文件头
PE文件头
映像文件头 :IMAGE_FILE_HEADER 可选映像头 :IMAGE_OPTIONAL_HEADER32 数据目录表 :IMAGE_DATA_DIRECTORY IMAGE_SECTION_HEADER
第三章 Windows PE格式
内容
PE文件
相关术语
PE文件格式详解 Windows病毒原理
1. PE文件
PE(Portable Executable)是Win32可执行文 件的标准格式,如*.EXE、*.DLL、*.OCX等, 都是PE格式 病毒籍EXE文件被执行时传播,Win32病毒 感染文件时,基本上将EXE文件作为目标
DOS头数据结构
typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE头部 USHORT e_magic; // 魔术数字 “MZ” USHORT e_cblp; // 文件最后页的字节数 USHORT e_cp; // 文件页数 USHORT e_crlc; // 重定义元素个数 USHORT e_cparhdr; // 头部尺寸,以段落为单位 USHORT e_minalloc; // 所需的最小附加段 USHORT e_maxalloc; // 所需的最大附加段 USHORT e_ss; // 初始的SS值(相对偏移量) USHORT e_sp; // 初始的SP值 USHORT e_csum; // 校验和 USHORT e_ip; // 初始的IP值 USHORT e_cs; // 初始的CS值(相对偏移量) USHORT e_lfarlc; // 重分配表文件地址 USHORT e_ovno; // 覆盖号 USHORT e_res[4]; // 保留字 USHORT e_oemid; // OEM标识符(相对e_oeminfo) USHORT e_oeminfo; // OEM信息 USHORT e_res2[10]; // 保留字 LONG e_lfanew; // 新EXE头部的文件地址 003c } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
节表 (Section Table)
IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER .text .data .edata .reloc ... COFF行号 COFF符号表 Code View调试信息
节 (Section)
Win32病毒运行流程
Win32病毒运行流程
①用户点击或系统自动运行HOST程序; ②装载HOST程序到内存; ③由PE文件的AddressOfEntryPoint加 ImageBase之和,定位第一条语句的位置(程序 入口); ④从第一条语句开始执行(其实是病毒代码); ⑤病毒主体代码执行完毕,将控制权交给HOST 程序原来的入口代码; ⑥HOST程序继续执行。
保护模式下,程序访问存储器所使用的逻辑地
址称为虚拟地址(VA),内存偏移地址(memory offset)
相对虚拟地址(Relative
Virtual Address,RVA)
指内存中相对于PE文件装入地址(基地址) 的偏移量 RVA=VA – imagebase
3. PE文件结构
P E 文 件 总 体 层 次 结 构
术语(续)
入口点(Entry point)
程序执行的第一行代码
基地址(Image base)
文件执行时将被映射到指定内存地址的存初始地址,
由PE文件本身决定。默认,EXE:0x00400000, DLL:0x1000000。用链接程序的/BASE选项改变该值
术语(续)
虚拟地址(Virtual Address,VA)
PE文件加载流程
Major steps in loading a PE file into memory:
When the PE file is run, the PE loader examines the DOS MZ header for the offset of the PE header. If found, it skips to the PE header. The PE loader checks if the PE header is valid. If so, it goes to the end of the PE header. Immediately following the PE header is the section table. The PE header reads information about the sections and maps those sections into memory using file mapping. It also gives each section the attributes as specified in the section table. After the PE file is mapped into memory, the PE loader concerns itself with the logical parts of the PE file, such as the import table.
问题
计算机病毒怎会在HOST程序之前执行?
2. 术语
文件偏移地址(File offset)
PE文件存储在磁盘上,各数据段的地址称为文件偏移
地址或物理地址(raw offset)。文件偏移地址从PE文件的第一个字节Fra bibliotek始计数,起始值为0
映射到内存中 磁盘中的PE文件 文件尾 文 件 偏 移 地 址 文件头 不能映射的数据 .reloc .data .text 节表 PE头 DOS头 DOS头 基地址(ImageBase) .reloc .data .text 某一虚拟地址(VA) 节表 PE头 相对虚拟地址(RVA)
调试信息
文件尾
3.1 DOS头与DOS插桩程序
DOS头与DOS插桩程序
PE结构中紧随MZ文件头之后的DOS插桩程序(DOS
Stub) IMAGE_DOS_HEADER结构识别一个合法的DOS头 该结构的e_lfanew(偏移60,32bits)成员定位PE开始的 标志0x00004550(“PE\0\0”) 病毒通过“MZ”、“PE”这两个标志,初步判断当前程 序是否是目标文件——PE文件。