什么是pe系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是pe系统相关的知识,希望对你有一定的参考价值。

什么是pe系统

Windows Preinstallation Environment(Windows PE),Windows预安装环境,是带有有限服务的最小Win32子系统,基于以保护模式运行的Windows XP Professional及以上内核。它包括运行Windows安装程序及脚本、连接网络共享、自动化基本过程以及执行硬件验证所需的最小功能。

Windows PE主要的使用环境是虚拟机,虚拟机环境与实际PC环境几乎没有区别(就是说如果你不清楚虚拟机也没关系,就当是在真实PC上直接运行)。

将Bios中设置成光驱引导,并开始启动系统,当屏幕画面上出现"Press any key boot from cd"时,按任意键从光驱上的Windows PE引导启动。如果你的存储设备驱动不被支持,在启动时按下F6键可加载特殊设备的驱动。

扩展资料:

Windows PE启动相当快捷,而且对启动环境要求不高;其功能几乎相当于安装了一个 Windows 的命令行版本。因此,对于个人计算机用户,只要将其写入U盘(或刻录在一张光碟上),便可放心地去解决初始化系统之类的问题;而对小型网络环境(如网吧等)用户来说,这一功能尤其实用。

在Windows系统下的可执行文件的一种(还有NE、LE),是微软设计、TIS(Tool Interface Standard,工具接口标准)委员会批准的一种可执行文件格式。PE的意思是Portable Executable(可移植可执行)。所有Windows下的32位或64位可执行文件都是PE文件格式,其中包括DLL、EXE、FON、OCX、LIB和部分SYS文件。

参考资料:百度百科-WindowsPE

参考技术A

PE系统一般指Windows PE。

Windows Preinstallation Environment(Windows PE),Windows预安装环境,是带有有限服务的最小Win32子系统,基于以保护模式运行的Windows XP Professional及以上内核。它包括运行Windows安装程序及脚本、连接网络共享、自动化基本过程以及执行硬件验证所需的最小功能。

Windows PE含有Windows XP、Windows Server 2003、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 10的PE内核。

扩展资料

在PE体系里边就能够对你电脑磁盘操作了,比如格局C盘(体系盘),这是因为pe是独自的保护体系,及时电脑自身的体系坏了也能够通过pe来发动电脑,然后修正或重装体系。因为PE体系具有轻盈,灵敏等长处,所以pe体系上面只要满足根本的体系功用。

现在许多电脑都没有装置光驱,其实只要有一个U盘就能够装体系,这就得归功于PE了。想要用PE装体系就得先把PE体系装置到U盘上(几十M左右,所以只要有U盘就能够装置PE),然后把U盘插在电脑上,设置从U盘发动电脑。这样就能够 进入pe体系。

参考资料

百度百科-Windows PE

参考技术B WindowsPE的作用不少朋友看到这儿无论是否有收获,肯定都会想WindowsPE到底对自己有什么明确的作用,这里不妨总结一二。1.方便易用的启动工具盘通过刚才的叙述,大家可以看出,WindowsPE启动相当快捷,而且对启动环境要求不高;最可贵的是,虽然名为启动盘,其功能却几乎相当于安装了一个WindowsXP的“命令行版本”——别忘了网络支持哦。因此,对于个人计算机用户,只要将其刻录在一张光碟上,便可放心地去解决初始化系统之类的问题;而对小型网络环境(如网吧等)用户来说,这一功能尤其实用。2.有趣的硬盘使用功能自定义的WindowsPE不仅可放到那些可移动存储设备如CD上,还可以放在硬盘上使用。因为许多朋友会认为将WindowsPE的自定义版本放在硬盘上没有什么意义,其实不然。把WindowsPE放在硬盘上应该是最为有趣的地方,且不说你的操作系统损坏无法进入的情况下启动硬盘上的WindowsPE可以方便地修复,关键是由于WindowsPE在硬盘上,所以在WindowsPE环境下安装应用程序就有了可能。呵呵,撇开题外话不讲,这里看一下如何把自定义的WindowsPE放到硬盘上吧(只能在硬盘上放置WindowsPE的32位版本)。首先要安装恢复控制台:(1)将WindowsXPProfessionalCD放在CD-ROM驱动器中,这里指定其为cd_drive。(2)在命令行CMD窗口中运行cd_drive\i386\winnt32.exe/cmdcons。然后将WindowsPE自定义可引导副本放置在硬盘上,如下操作:(1)在目标硬盘上,创建“C:\Minint”的目录(这里必须将目录命名为“Minint”)。(2)将WindowsPE“根目录\i386”下的所有内容复制到C:\Minint。(3)从WindowsPE根目录下将Winbom.ini复制到目标硬盘的根目录。(4)在目标硬盘上,将“C:\Cmdcons\txtsetup.sif”的只读属性改为读/写。(5)在目标硬盘上,将“C:\Minint\txtsetup.sif”复制到“C:\Cmdcons”进行覆盖。(6)重新启动目标计算机。在“引导”菜单上,选择引导到“命令控制台”,计算机将使用WindowsPE引导。3.WindowsXPOPKCD的本职工作上面说了其实我们拿到的是WindowsPE的一个可执行副本,即WindowsXPOPK(WindowsXPOEM预安装工具包)CD。从名字都知道它原来的本职工作是为了方便OEM工作的。如果你在Windows操作系统环境下打开光碟,它就会自动运行Autorun为你的系统安装一个“Windows安装管理器”的工具包。利用它,你可以轻易制造出带有计算机厂商OEM标志的Windows安装镜像。虽然这是WindowsXPOPKCD的主要本职工作,但显然对我们个人没什么意义,当然,如果你想把手上的Windows安装CD都打上自己独有的印记,并在朋友的机器上安装时炫一下,那么使用它是个好主意。当然自己的“印记”绝非OEM标志那么简单,实际上你还可任意设定WindowsPE携带的软件,并可设置这些软件在WindowsPE启动时运行;理想的情形下你甚至可以为自定义的WindowsPE版本加上类似于WindowsExplorer的图形外壳程序——要不怎么叫专为厂商OEM设计呢? 参考技术C Winpe全称 Windows Preinstall Environment,即“Windows 预安装环境”。是一个用于Windows 安装准备的最小操作系统。
  基于保护模式下运行Windows XP Prodessional内核,是一个精简的Win32子系统。
  pe系统的版本类型
  我们熟悉的pe大致有:
  1.U盘装系统里PE启动的U盘PE。例如口袋PE 里的Windows8PE、Win2003PE维护系统。
  2.光盘装系统中WindowsPE的光盘PE。
  3.以及电脑自带的WindowsPE。
  pe系统的作用
  pe是急救系统,在电脑无法开机时,可以通过pe系统修复电脑里的各种问题,比如删除顽固病毒,修复磁盘引导分区,给硬盘分区,数据备份等。
  总结来说,可以实现Windows安装、网络共享、自动底层处理进程、硬件验证等作用。
  pe系统运行机制
  pe运行是依靠镜像释放(在PE运行时就释放了),在计算机内存和硬盘缓存文件中运行。
  PS:由此我们可以知道,PE系统不能运行主要原因是硬件驱动无法加载、缓存无法写入造成。而缓存无法写入的原因最大,有CHS、LBA的原因,也有硬盘自身加载的问题。
  pe系统的注意事项
  尽管pe系统有诸多优点,同样我们要注意以下两点:
  1.若PE核心过于精简无法通过驱动加载会导致蓝屏死机。
  2.Pe无法运行,选择的模式错误也可能是原因之一。要注重CHS、LBA模式。
  【温馨提示】很多情况下,我们都可以使用PE来进行问题解决。例如电脑中了顽固病毒,在安全模式下由于杀毒软件CPU占用率过高,很容易造成电脑假死或死机,导致病毒无法查杀,而PE就不会出现该情况,还能完美解决病毒问题!
  为了更加方便用户重装系统,windows7之家现推出windows系统之家重装大师,windows之家系统重装大师内集成了windows之家更新的各类最新 windows系统,包括XP/Win7/Win8/Win10等系统。让您在也不用为不会装机而烦恼了,强烈推荐大家使用!
参考技术D pe系统是一般安装在U盘 或者 CD上的系统
Windows PE 是带有限服务的最小Win32子系统,基于以保护模式运行的Windows XP Professional内核。它包括运行Windows安装程序及脚本、连接网络共享、自动化基本过程以及执行硬件验证所需的最小功能。”换句话说,你可把Windows PE看作是一个只拥有最少核心服务的Mini操作系统。微软推出这么一个操作系统当然是因为它拥有与众不同的系统功能,如果要用一句话来解释,我认为与Win9X/2000/XP相比,Windows PE的主要不同点就是:它可以自定义制作自身的可启动副本,在保证你需要的核心服务的同时保持最小的操作系统体积,同时它又是标准的32位视窗API的系统平台。当然,现在这么说也许难以理解,没有关系

PE有趣的硬盘使用功能
自定义的Windows PE不仅可放到那些可移动存储设备如CD上,还可以放在硬盘上使用。因为许多朋友会认为将Windows PE的自定义版本放在硬盘上没有什么意义,其实不然。把Windows PE放在硬盘上应该是最为有趣的地方,且不说你的操作系统损坏无法进入的情况下启动硬盘上的Windows PE可以方便地修复,关键是由于Windows PE在硬盘上,所以在Windows PE环境下安装应用程序就有了可能。呵呵,撇开题外话不讲,这里看一下如何把自定义的Windows PE放到硬盘上吧(只能在硬盘上放置Windows PE的32位版本)。
首先要安装恢复控制台:
(1)将Windows XP Professional CD放在CD-ROM驱动器中,这里指定其为cd_drive。
(2)在命令行CMD窗口中运行cd_drive\i386\winnt32.exe /cmdcons。
然后将Windows PE自定义可引导副本放置在硬盘上,如下操作:
(1)在目标硬盘上,创建“C:\Minint”的目录(这里必须将目录命名为“Minint”)。
(2)将Windows PE“根目录\i386”下的所有内容复制到C:\Minint。
(3)从Windows PE根目录下将Winbom.ini复制到目标硬盘的根目录。
(4)在目标硬盘上,将“C:\Cmdcons\txtsetup.sif”的只读属性改为读/写。
(5)在目标硬盘上,将“C:\Minint\txtsetup.sif”复制到“C:\Cmdcons”进行覆盖。
(6)重新启动目标计算机。在“引导”菜单上,选择引导到“命令控制台”,计算机将使用Windows PE引导。本回答被提问者采纳

逆向工程——PE

 在(一)中我们主要讨论了什么是PE以及PE头的组成结构,由此我们继续深入学习PE头的核心内容——IAT(IMPORT  Address  Table)和EAT(EXPORT Address Table)

  在进行Windows程序编程时,我们会使用到windows的各种API,那么在C语言里有类似的include语句,而在实现方面,操作系统是并不认识include语句的,其次,Windows使用了较为庞大的库函数来支持环境,因此运行多个进程,每个程序运行时都包含相同的库,会造成严重的内存浪费。这个时候,操作系统就使用一种手段,称为动态链接库(Dynamic Link Library,简称DLL),DLL的功能很强大,它是用来连接程序与库之间的联系,像桥梁的关系。在PE头(程序的PE头)里有一个IAT表,里面记录了程序正在使用哪些库中的哪些函数,而在DLL的PE头中则存在一张EAT表,它可以准确地求得从相应库中导出函数的起始地址。

  使用DLL的好处主要有以下三点:

    1. 不需要把整个库加载进内存,需要什么用什么就行了。
    2. 进行内存映射以后,DLL文件可以被多个进程共享,不会造成资源的浪费。
    3. 更新库函数,只需要修改DLL里对应的地址即可。
  • IAT

技术分享图片

      IAT的结构体为IMAGE_IMPORT_DESCRIPTOR,是PE头中可选项IMAGE_OPTIONAL_HEADER32里的DataDirectory[1],起始地址为IMAGE_OPTIONAL_HEADER32.DataDirectory[1].VirtualAddress(是RVA值,图中为1F4AC),Size为230。

 1 typedef struct _IMAGE_IMPORT_DESCRIPTOR {
 2     union {
 3         DWORD   Characteristics;            // 0 for terminating null import descriptor
 4         DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
 5     };
 6     DWORD   TimeDateStamp;                  // 0 if not bound,
 7                                             // -1 if bound, and real date	ime stamp
 8                                             //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
 9                                             // O.W. date/time stamp of DLL bound to (Old BIND)
10 
11     DWORD   ForwarderChain;                 // -1 if no forwarders
12     DWORD   Name;
13     DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
14 } IMAGE_IMPORT_DESCRIPTOR;
15 typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
16 
17 typedef struct _IMAGE_IMPORT_BY_NAME {
18     WORD    Hint;
19     BYTE    Name[1];
20 } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

  执行一个文件通常需要导入多个库,导入多少库就有多少个IMAGE_IMPORT_DESCRIPTOR结构体,这些结构体组成数组,结构体数组最后以NULL结束。

       由上图的RVA地址(1F4AC)----->文件偏移地址为1C0AC(1F4AC - 所在节区的VirtualAddress(1F000) + PointerToRawData(1BC00) ),下图灰色选中区域即为第一个结构体。

技术分享图片

 

  Address     values          tips
1
01C0AC 0001F6DC OriginalFirstThunk(INT) 2 01C0B0 00000000 TimeDateStamp 3 01C0B4 00000000 ForwarderChain 4 01C0B8 0001FC7E Name 5 01C0BC 0001F000 FirstThunk(IAT)

 

    • Name

      Name是一个字符串指针,指向导入函数所属的库文件名称。(RVA 1FC7E  --->  FOA 1C87E)

技术分享图片

 

    • OriginalFirstThunk(INT)

      INT的各个元素的值为IMAGE_IMPORT_BY_NAME结构体指针,是由IMAGE_IMPORT_BY_NAME数组构成的表,每4个字节存放着对应的函数名称和Hint。

技术分享图片

01C2DC        0001FB84        IMAGE_IMPORT_BY_NAME
...... ...... ...... ......

      我们查看IMAGE_IMPORT_BY_NAME(数组中第一个元素)(RVA  1FB84  --->  FOA  1C784)。下图就是存放函数名字的空间。前2个字节为Hint编号,也称为Ordinal,是库中函数的编号,后面一长串是函数的名字。

技术分享图片

01C784        0215               Hint
01C786        4F70656E50......        Name
    • FirstThunk(IAT)

        IAT数组中存放的每一个元素中的值是函数的地址(RVA  1F000  --->  FOA  1BC00)。有时IAT也拥有和INT一样的值,如下图。(1FB84转换为FOA与IAT的值一样)

技术分享图片      IAT的输入(装载)顺序:

      1. 读取IMAGE_IMPORT_DESCRIPTOR结构体中的name成员,获取库名称字符串。
      2. 装载相对应的库(LoadLibrary("库名称字符串"))
      3. 读取IMAGE_IMPORT_DESCRIPTOR的OriginalFirstThunk成员,获取INT入口地址。
      4. 再逐一读取INT中数组的值,获取相对应IMAGE_IMPORT_BY_NAME地址(RVA地址)。
      5. 使用IMAGE_IMPORT_BY_NAME的Hint或者是Name成员,获取相应函数的起始地址。eg: GetProcAddress("GetCurrentThreadld")
      6. 读取IMAGE_IMPORT_DESCRIPTOR的FirstThunk(IAT)成员,获取IAT的地址。
      7. 最后将第5步求得的函数地址输入相应的IAT数组中。
      8. 重复以上4—7步骤,直到最后遇到NULL(NULL为结束)时结束。
  • EAT

    也有细心的读者发现了,在notepad.exe文件里的IMAGE_OPTIONAL_HEADER32.DataDirectory[0]的地址和大小都为0,也就是说,可执行文件只需要“保管好”自己的IAT表就可以了,而DLL文件则“保管好”自己的EAT值。以下是Kernel32.dll文件中的EAT值。

技术分享图片

 

 

1 000168   00091020   RVA of EXPORT DIRECTORY 
2 00016C   0000D850   size of EXPORT DIRECTORY 
    • IMAGE_EXPORT_DIRECTORY结构体
 1 typedef struct _IMAGE_EXPORT_DIRECTORY {
 2     DWORD   Characteristics;
 3     DWORD   TimeDateStamp;
 4     WORD    MajorVersion;
 5     WORD    MinorVersion;
 6     DWORD   Name;
 7     DWORD   Base;
 8     DWORD   NumberOfFunctions;
 9     DWORD   NumberOfNames;
10     DWORD   AddressOfFunctions;     // RVA from base of image
11     DWORD   AddressOfNames;         // RVA from base of image
12     DWORD   AddressOfNameOrdinals;  // RVA from base of image
13 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
NumberOfFunctions             实际Export函数的个数
NumberOfNames                 Export函数中具名的函数个数
AddressOfFunctions            Export函数地址数组(数组元素个数 = NumberOfFunctions)
AddressOfNames                函数名称地址数组(数组元素个数 = NumberOfNames)
AddressOfNameOrdinals         Ordinal地址数组(数组元素个数 = NumberOfNames)

       由上图可知,结构体位置在73020(RVA 91020  ---> FOA 73020)

技术分享图片

 1 073020        00000000        Characteristics
 2 073024        AE0A74BF        TimeDateStamp
 3 073028        0000            MajorVersion
 4 07302A        0000            MinorVersion
 5 07302C        00094E96        Name
 6 073030        00000001        Base
 7 073034        0000063B        NumerOfFuctions
 8 073038        0000063B        NumberOfNames
 9 07303C        00091048        AddressOfFunctions
10 073040        00092934        AddressOfNames
11 073044        00094220        AddressOfNameOrdinals
    • 函数名称数组(AddressOfNames) RVA 92934 ---> FOA 74934,以下图即为数组。每4个字节代表函数名称的RVA地址。

技术分享图片我们以94F02为例,(RVA  94F02  --->  FOA  76F02),以下深色选中区域即为函数名称。

技术分享图片

我们再查找Ordinal数组。(RVA  94220  --->  FOA  76220),每2个字节代表索引号(Ordinal)。94F02处的函数名的索引号为0003。

技术分享图片

最后我们再根据索引号,查出此函数的实际函数地址。通过AddressOfFunctions成员(RVA  91048  --->  FOA  73048 )的入口地址,再加上索引号产生的偏移量来确定函数地址。


技术分享图片

                     AddressOfFunctions[Ordinal] = RVA  (ordinal = 3 , RVA = 94F1A)

                Kernel32.dll的ImageBase = 6B800000,因此,此函数的实际地址(VA)为6B894F1A(ImageBase + RVA)。

      以上演示的过程的原理其实就是模拟了GetProcAdress()API函数的操作原理:

        1. 利用AddressOfNames成员转到“函数名称数组”。
        2. “函数名称数组”中存储着字符串地址。通过比较函数(strcmp)字符串,来查找函数名称。找到以后产生一个索引值(name_index)
        3. 利用AddressOfNameOrdinals成员,转到ordinal数组。
        4. 在ordinal数组中通过name_index查找与之相对应的ordinal值:AddressOfNameOrdinals[index] = ordinal 
        5. 再利用AddressOfFunctions成员转到“函数地址数组”(EAT)
        6. 最后在“函数地址数组”中将求得的ordinal值用作数组索引,获得指定数组的起始地址。

 

 

 

 

 

 

 

 

 

  

 




以上是关于什么是pe系统的主要内容,如果未能解决你的问题,请参考以下文章

什么是pe系统

pe的程序内置了,为什么还要用u盘启动?

pp和pe有啥区别?

一文读懂PE格式

联想笔记本thinkpad重装系统进不了pe桌面是啥原因呢,PE是好的

我用pe重装系统后出现内存不能read