WindowsPE文件格式

合集下载

PE文件格式详解

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文件格式

PE文件格式
WORD e_cp; // Pages in file
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开始的标志呢

PE文件格式详解

PE文件格式详解

PE文件格式详解摘要Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。

PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。

然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。

本文旨在解决这一问题,它会对整个的PE文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述以及示范如何使用这些信息的源码示例。

为了获得PE文件中所包含的重要信息,我编写了一个名为PEFILE.DLL的动态链接库,本文中所有出现的源码示例亦均摘自于此。

这个DLL和它的源代码都作为PEFile示例程序的一部分包含在了CD中(译注:示例程序请在MSDN中寻找,本站恕不提供),你可以在你自己的应用程序中使用这个DLL;同样,你亦可以依你所愿地使用并构建它的源码。

在本文末尾,你会找到PEFILE.DLL的函数导出列表和一个如何使用它们的说明。

我觉得你会发现这些函数会让你从容应付PE文件格式的。

介绍Windows操作系统家族最近增加的Windows NT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。

新的PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS 及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。

在本文之中,PE文件格式是以自顶而下的顺序解释的。

在你从头开始研究文件内容的过程之中,本文会详细讨论PE文件的每一个组成部分。

许多单独的文件成分定义都来自于Microsoft Win32 SDK开发包中的WINNT.H文件,在这个文件中你会发现用来描述文件头部和数据目录等各种成分的结构类型定义。

但是,在WINNT.H中缺少对PE文件结构足够的定义,在这种情况下,我定义了自己的结构来存取文件数据。

WindowsPE文件格式

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分区格式

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将能够正常运行并满足您的需求。

PE文件格式(内容详细)

PE文件格式(内容详细)
EXE文件的格式
简介
在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文件结构与ELF文件结构

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下几乎已经没有什么作用了。

pe文件

pe文件
文件层次解释
A.
谢谢观看
Hale Waihona Puke pe文件可移植的可执行的文件
01 定义
03 PE首部
目录
02 相关概念 04 文件格式
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都 是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)
定义
一个操作系统的可执行文件格式在很多方面是这个系统的一面镜子。虽然学习一个可执行文件格式通常不是 一个程序员的首要任务,但是你可以从这其中学到大量的知识。在这篇文章中,我会给出 Microsoft的所有基于 win32系统(如winnt,win9x)的可移植可执行(PE)文件格式的详细介绍。在可预知的未来,包括Windows2000, PE文件格式在 MicroSoft的操作系统中扮演一个重要的角色。如果你在使用 Win32或 Winnt,那么你已经在使 用 PE文件了。甚至你只是在 Windows3.1下使用 Visual C++编程,你使用的仍然是 PE文件(Visual C++的 32位MS-DOS扩展组件用这个格式)。简而言之,PE格式已经普遍应用,并且在不短的将来仍是不可避免的。
和微软的其它可执行格式一样,你可以通过查找它的起始偏移来得到真实首部,这个偏移放在DOS残留首部 中。WINNT.H头文件包含了DOS残留程序的数据结构定义,使得很容易找到PE首部的起始位置。e_lfanew域是PE 真实首部的偏移。为了得到PE首部在内存中的指针,只需要把这个值加到映像的基址上即可。
线程局部变量
我最后不会让你盯住无穷无尽的十六进制Dump,也不会详细讨论页面的每一个单独的位的重要性。代替的, 我会向你介绍包含在 PE文件中的概念,并且将他们和你每天都遇到的东西联系起来。比如,线程局部变量的概 念,如下所述:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
保护模式下,程序访问存储器所使用的逻辑地
址称为虚拟地址(VA),内存偏移地址(memory offset)

相对虚拟地址(Relative

Virtual Address,RVA)
指内存中相对于PE文件装入地址(基地址) 的偏移量 RVA=VA – imagebase
3. PE文件结构

P E 文 件 总 体 层 次 结 构
节表 (Section Table)
IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER .text .data .edata .reloc ... COFF行号 COFF符号表 Code View调试信息
节 (Section)
3.2 PE文件头

PE文件头
紧接着DOS
Stub的是PE header PE header是IMAGE_NT_HEADERS的简称,即NT映 像头(PE文件头),存放PE整个文件信息分布的 重要字段,包含了许多PE装载器用到的重要域。 执行体在支持PE文件结构的操作系统中执行时 PE装载器将从DOS MZ header中找到PE header 的起始偏移量,从而跳过DOS Stub直接定位到 真正的文件头PE header

可选映像头
PE文件头--可选映像头
(续)
WORD MajorOperatingSystemVersion; // 0x3e,操作系统主/次版本, WORD MinorOperatingSystemVersion; // 0x40,Loader并没有用这两个值 WORD MajorImageVersion; // 0x42,可执行文件主/次版本 WORD MinorImageVersion; // 0x44 WORD MajorSubsystemVersion; // 0x46,子系统版本号 WORD MinorSubsystemVersion; // 0x48 DWORD Win32VersionValue; // 0x4c,Win32版本,一般是0 DWORD SizeOfImage; // 0x50,程序调入后占用内存大小(字节) DWORD SizeOfHeaders; // 0x54,文件头的长度之和 DWORD CheckSum; // 0x58,校验和 WORD Subsystem; // 0x5c,可执行文件的子系统 WORD DllCharacteristics; // 0x5e,何时DllMain被调用,一般为0 DWORD SizeOfStackReserve; // 0x60,初始化线程时保留的堆栈大小 DWORD SizeOfStackCommit; // 0x64,初始化线程时提交的堆栈大小 DWORD SizeOfHeapReserve; // 0x68,进程初始化时保留的堆大小 DWORD SizeOfHeapCommit; // 0x6c,进程初始化时提交的堆大小 DWORD LoaderFlags; // 0x70,装载标志,与调试相关 DWORD NumberOfRvaAndSizes; // 0x74,数据目录的项数,一般是16 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
调试信息
文件尾
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文件。
第三章 Windows PE格式
内容
PE文件 相关术语 PE文件格式详解 Windows病毒原理
1. PE文件Biblioteka PE(Portable Executable)是Win32可执行文 件的标准格式,如*.EXE、*.DLL、*.OCX等, 都是PE格式 病毒籍EXE文件被执行时传播,Win32病毒 感染文件时,基本上将EXE文件作为目标
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
字符串“PE\0\0”(Signature)(4H字节)
PE文件头--映像文件头
映像文件头,包含有PE文件的基本信息
typedef struct _IMAGE_FILE_HEADER { WORD Machine; // 0x04,该程序要执行的环境及平台 WORD NumberOfSections; // 0x06,文件中节的个数 DWORD TimeDateStamp; // 0x08,文件建立的时间 DWORD PointerToSymbolTable; // 0x0c,COFF符号表的偏移 DWORD NumberOfSymbols; // 0x10,符号数目 WORD SizeOfOptionalHeader; // 0x14,可选头的长度 WORD Characteristics; // 0x16,标志集合 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
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;

Win32病毒运行流程

Win32病毒运行流程
①用户点击或系统自动运行HOST程序; ②装载HOST程序到内存; ③由PE文件的AddressOfEntryPoint加 ImageBase之和,定位第一条语句的位置(程序 入口); ④从第一条语句开始执行(其实是病毒代码); ⑤病毒主体代码执行完毕,将控制权交给HOST 程序原来的入口代码; ⑥HOST程序继续执行。
术语(续)

入口点(Entry point)
程序执行的第一行代码

基地址(Image base)
文件执行时将被映射到指定内存地址的存初始地址,
由PE文件本身决定。默认,EXE:0x00400000, DLL:0x1000000。用链接程序的/BASE选项改变该值
术语(续)

虚拟地址(Virtual Address,VA)
PE文件头(续)

PE文件头结构
IMAGE_NT_HEADERS STRUCT Signature dd ? FileHeader IMAGE_FILE_HEADER <> OptionalHeader IMAGE_OPTIONAL_HEADER32 <> IMAGE_NT_HEADERS ENDS
PE文件头--可选映像头
typedef struct _IMAGE_OPTIONAL_HEADER { // 标准域: WORD Magic; // 0x18,一般是0x010B BYTE MajorLinkerVersion; // 0x1a,链接器的主/次版本号, BYTE MinorLinkerVersion; // 0x1b,这两个值都不可靠 DWORD SizeOfCode; // 0x1c,可执行代码的长度 DWORD SizeOfInitializedData; // 0x20,初始化数据的长度(数据节) DWORD SizeOfUninitializedData; // 0x24,未初始化数据的长度(bss节) DWORD AddressOfEntryPoint; // 0x28,代码的入口RVA地址 DWORD BaseOfCode; // 0x2c,可执行代码起始位置,意义不大 DWORD BaseOfData; / 0x30,初始化数据起始位置,意义不大 // NT 附加域: DWORD ImageBase; // 0x34,载入程序首选的RVA地址 DWORD SectionAlignment; // 0x38,加载后节在内存中的对齐方式 DWORD FileAlignment; // 0x3c,节在文件中的对齐方式 (待续)
相关文档
最新文档