修改BOOT .WIM文件,打造自己的PE系统

修改BOOT .WIM文件,打造自己的PE系统
修改BOOT .WIM文件,打造自己的PE系统

VISTA WIN7 WIN8PE用基本映像BOOT.WIM文件

DIY方法

说明:BOOT.WIM(或boot.wim)文件,是VISTAPE、WIN7PE、WIN8PE的基本映像文件,修改、打造自己的VISTA WIN7 WIN8PE,就是修改BOOT.WIM文件中的相关内容。

一、工具准备:

1、AIK(Windows Automated Installation Kit,Windows自动安装工具包)简体中文版用来将BOOT.WIM文件解开和打包。使用其他WIM打包工具加载PE时,有时会出现莫名错误。

2、下载现成的PE文件(内含BOOT.WIM文件),文件格式大都为ISO格式。

3、UltraISO(软碟通),用来修改PE的ISO镜像文件。

4、压缩软件:用来解压ISO文件。但不能打包成ISO格式。

5、虚拟机,用来测试修改后的PE。

二、具体方法:

1、安装Windows Automated Installation Kit简体中文版。

2、启动部署工具命令提示:

单击“开始”,在开始菜单中点击“Microsoft Windows AIK”文件夹,在“部署工具命令提示行”上击右键,选择“以管理员身份运行”。

部署工具命令启动界面如下图:

3、构建PE环境:

在部署工具命令提示行窗口内输入命令:copype.cmd x86 F:\mywinpe (复制PE文件到F盘mywinpe文件夹下。(注意:此处的盘符“F”可以改成“D”或“E”,想放在哪个盘就改成哪个盘的盘符),回车。

注意:命令只需要在上面的执行界面中输入即可,特别注意符号一定要正确,比如反斜杠、分隔符等等。

执行结果,如下图:

这时候检查F盘会有个mywinpe目录,目录结构如下右图:

说明:

ISO目录包含构建.iso文件所必须文件,但未包含boot.wim文件。mount目录是用来装载WINPE映像,即将BOOT.WIM文件展开后的文件,这些文件是PE的主文件,添加、修改或定制WINPE映像文件就是修改这个文件夹(mount)中的文件。如果新手对这两句话不明白可以先向后进行,回头再看。

4、将基本映像Winpe.wim复制到ISO的sources目录下:

接着在部署工具命令提示行输入如下命令并回车:

copy F:\mywinpe\winpe.wim F:\mywinpe\ISO\sources\boot.wim

注意:命令中的字母、符号一定不能输错!最好按截图中的命令输入。

执行效果图:

执行完该命令后F盘的mywinpe\ISO\sources下会多个boot.wim映像文件,这个文件是微软原汁原味的PE主文件,用该文件制作的PE系统没有任何工具和桌面,需要用其他已经制作好的PE中的WIM文件替换。

5、将自己下载的别人制作好的PE ISO文件解压(用压缩软件即可解压),在解压后的BOOT文件夹内找到BOOT.WIM文件,复制到上面的F:\mywinpe\ISO\sources内,替换原来的BOOT.WIM文件。

6、展开BOOT.WIM文件:

在部署工具命令行窗口继续输入如下命令并回车(一定要按下面的截图所示内容输入,不要输错!命令不区分大小写):

Dism /Mount-Wim /Wimfile:F:\mywinpe\ISO\sources\boot.wim /index:1

/MountDir:F:\mywinpe\mount

操作完成后,可以看到F:\mywinpe\mount目录下已经有了这些“解压”文件,如下图:

7、修改PE映像文件(即PE主文件),打造自己的PE.

1)、更换桌面背景图片:

用图片制作工具制作好自己喜欢的桌面背景图片,大小为1920*120或1024*768(与原图片大小相同即可,格式为JPG,文件名为:img0),将图片复制到F:\mywinpe\mount\windows\web\wallpaper\Windows内,替换原图片。

2)更换开始菜单中登录用户图片:

图片格式为bmp,大小为120*120(可与原图片大小相同),文件名为user

复制到F:\mywinpe\mount\ProgramData \Microsoft\User Account Pictures文件夹下,替换原图片。

3)向PE内添加工具:

PE中的工具文件都在F:\mywinpe\mount\Program Files内,将需要添加的工具文件所在文件夹复制到该文件夹内(同时需要修改PE内的PECMD.INI配置文件,才能将添加的软件真正添加到PE中)。

4)修改配置文件:pecmd.ini

在PE中添加(或删除)相关工具软件,一定要在配置文件pecmd.ini中进行关联(或去掉相应关联)。配置文件一般都在

F:\mywinpe\mount\windows\System32文件夹内:

在该配置文件上击右键,选择“编辑”即可打开配置文件。仿照配置文件中的命令,将自己添加的工具软件添加(关联)到PE的“桌面”和开始菜单的“程序”中,可复制原配置命令,再修改,修改完后保存。注意修改时文件夹目录和相关字符不要弄错!

5)修改启动PE后进入桌面前的启动图片:

该图片一般位于F:\mywinpe\mount\windows\System32文件夹内,一般都是一张图片,文件名为logo,用修改后的图片替换原图片即可。格式为JPG,大小为1024*768.

必要时也要修改配置文件中的相关联的命令。若原PE中没有启动图片的可自己添加,添加后需在原PECMD.INI配置文件中设置一下:

8、将PE主文件打包成WIM文件:

修改完PE主文件后,需要打包成WIM格式的文件。(注意:修改完后需要将F:\mywinpe\mnunt文件夹关闭,再打包,避免出错!)

接着在“部署工具命令提示行”中输入如下命令,并回车,进行打包。

命令:Dism /unmount-Wim /MountDir:F:\mywinpe\mount /Commit

这条命令执行,要等一会儿,执行结果如下图:

执行完后,F:\mywinpe\mount目录会被自动清空,相当于又“压缩”回去。

打包后的BOOT.WIM文件仍存在F:\mywinpe\iso\sources文件夹内。

9、生成ISO映像:

运行UltraISO(软碟通),单击“文件”“打开”,找到原来下载的PE ISO镜像文件(原文件是可引导的),打开:

在窗口中的“光盘目录”下找到“BOOT.WIM”文件,再在下方的“本地目录”中找到上面修改后并打包的“BOOT.WIM”文件,在“本地目录”右侧“文件名”栏下的“BOOT.WIM”文件上右键,选择“添加”,询问是否“替换原BOOT.WIM”文件,单击“是”,替换原PE ISO文件中的BOOT.WIM文件,然后单击“文件”,选择“存储为”,保存为ISO文件。

三、测试修改后的ISO 文件:

运行虚拟机程序,单击“DVD 图标”,打开“虚拟机设置”对话框,单击“使用ISO 镜像文件”单选按钮,单击右侧的“浏览”,找到上面重新生成的ISO 镜像文件,单击“确定”按钮,单击“打开虚拟机电源”按钮,启动虚拟机进行测试。

注意:虚拟机必须设置成“从光盘启动”!

四、继续修改:

若经测试后若并不满意,可以重新修改BOOT.WIM文件。

修改时只需重复上面的6—9步即可。

注意:若在“部署工具命令提示行”中输入错误命令,导致不能继续操作时,可将“部署工具命令提示行”窗口关闭,同时将F盘中的mywinpe文件夹及内部

文件全部删除,再重新启动“部署工具命令提示行”工具,重新开始操作。

pe文件格式

PE文件格式详解(一)――基础知识 什么是PE文件格式: 我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Wind ow系统中的可执行文件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文件的时候有W indow的加载器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪些重要信息。然后生成一个进程,如果进程中涉及到多个线程还要生成一个主线程;此后进程便开始运行;这里面涉及的东西很多,包括:PE文件格式的内容;内存管理(CPU内存管理的硬件环境以及在此基础上的OS内存管理方式);模块,进程,线程的知识;只有把这些都弄清楚之后才能比较清楚的了解这整个过程。下面就让我们先来学习PE文件格式吧。

PE格式基础及程序的装入

DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。 DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。 PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。 Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。 二、程序的装入 当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一个有效的PE文件,拒绝执行。 如果DOS Header 和PE Header都正常有效,那么Loader就会根据PE Header 及Section Table的指示,将相应的代码和数据映射到内存中,然后根据不同的Section进行数据的初始化,最后开始执行程序段代码。 三、PE格式高级分析 下面我们以一个真实的程序为例详细分析PE格式,分析PE格式最好有PE分析器,常用的软件是Lord PE,也有其它的分析工具和软件如PE Editor 、Stud PE等。 先分析一下磁盘文件的内容,这里我们使用UltraEdit32(UE)工具,这是一个实用的文件编辑器,可以编辑文本和二进制文件。

PE文件头解析大全

PE可选头部 PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针: PEFILE.H #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \ ((PIMAGE_DOS_HEADER)a)->e_lfanew + \ SIZE_OF_NT_SIGNATURE + \ sizeof(IMAGE_FILE_HEADER))) 可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下: WINNT.H typedef struct _IMAGE_OPTIONAL_HEADER { // // 标准域 // USHORT Magic; UCHAR MajorLinkerVersion; UCHAR MinorLinkerVersion; ULONG SizeOfCode; ULONG SizeOfInitializedData; ULONG SizeOfUninitializedData; ULONG AddressOfEntryPoint; ULONG BaseOfCode; ULONG BaseOfData; // // NT附加域 // ULONG ImageBase; ULONG SectionAlignment;

ULONG FileAlignment; USHORT MajorOperatingSystemVersion; USHORT MinorOperatingSystemVersion; USHORT MajorImageVersion; USHORT MinorImageVersion; USHORT MajorSubsystemVersion; USHORT MinorSubsystemVersion; ULONG Reserved1; ULONG SizeOfImage; ULONG SizeOfHeaders; ULONG CheckSum; USHORT Subsystem; USHORT DllCharacteristics; ULONG SizeOfStackReserve; ULONG SizeOfStackCommit; ULONG SizeOfHeapReserve; ULONG SizeOfHeapCommit; ULONG LoaderFlags; ULONG NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; 如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。 标准域 首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。 ·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

PE文件结构

检验PE文件的有效性 <1>首先检验文件头部第一个字的值是否等于IMAGE_DOS_SIGNATURE,是则表示DOS MZ header有效 <2>一旦证明文件的Dos header 有效后,就可用e_lfanew来定位PE header <3>比较PE header 的第一个字的值是否等于IMAGE_NT_HEADER,如果前后两个值都匹配. PS.WinHex使用方法 1.Alt+G跳到指定位置 2.Ctrl+Shift+N放入新文件 3.大文件扩容,新建一个扩容大小+1的文件,把这个文件的数据复制后写入整个文件的尾地址. 4.文本搜索ctrl+F 5.十六进制搜索ctrl+alt+x 6.文本显示F7 7.打开内存alt+F9 8.进制转换器F8 9.分析选块F2 10.计算HASH ctrl+F2 11.收集文本信息ctrl+F10 12.编辑模式F6 一.IMAGE_DOS_HEADER <1>位置00H,WORD(2个字节)的e_magic为4D5A,即MZ <2>位置3CH,60,LONG(4个节节)的e_lfanew为64+112=176即B0H, 二.IMAGE_NT_HEADERS <1>位置B0H,DWORD(4个字节),PE开始标记,写入50450000,即PE <2>位置B4H,WORD,PE所要求的CPU,对于Intel平台,为4C01 <2>位置B6,WORD,PE中段总数,计划有3个段,.text代码段,.rdata只读数据段,.data全局变量数据段,所以值为0300, <3>位置C4,WORD,表示后面的PE文件可选头的占空间大小,即224字节(E0),值为E000 <4>位置C6,WORD,表示文件是EXE还是DLL,如果是可执行文件写0200,如果是dll,写0020, <5>位置C8,WORD,表示文件格式,如果是0B01表示.exe,如果是0701表示ROM映像

pe文件结构 入门 教程

三年前,我曾经写了一个手工打造可执行程序的文章,可是因为时间关系,我的那篇文章还是有很多模糊的地方,我一直惦记着什么时候再写一篇完美的,没想到一等就等了三年。因为各种原因直到三年后的今天我终于完成了它。现在把它分享给大家,希望大家批评指正。 我们这里将不依赖任何编译器,仅仅使用一个十六进制编辑器逐个字节的手工编写一个可执行程序。以这种方式讲解PE结构,通过这个过程读者可以学习PE结构中的PE头、节表以及导入表相关方面的知识。为了简单而又令所有学习程序开发的人感到亲切,我们将完成一个Hello World! 程序。功能仅仅是运行后弹出一个消息框,消息框的内容是Hello World!。 首先了解一下Win32可执行程序的大体结构,就是通常所说的PE结构。 如图1所示PE结构示意图: 图1 标准PE结构图 由图中可以看出PE结构分为几个部分: MS-DOS MZ 头部:所有PE文件必须以一个简单的DOS MZ 头开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS程序。以此达到对Dos系统的兼容。(通常情况DOS MZ header总共占用64byte)。 MS-DOS 实模式残余程序:实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显

示一个错误提示,大多数情况下它是由汇编编译器自动生成。通常,它简单调用中断21h,服务9来显示字符串"This program cannot run in DOS mode"。(在我们写的程序中,他不是必须的,可以不予以实现,但是要保留其大小,大小为112byte,为了简洁,可以使用00来填充。) PE文件标志:是PE文件结构的起始标志。(长度4byte, Windows程序此值必须为0x50450000) PE文件头:是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header中找到PE header的起始偏移量,跳过了MS-DOS 实模式残余程序,直接定位到真正的文件头PE header,长度20byte。 PE文件可选头:虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。(长度 224byte )。 各段头部:又称节头部,一个Windows NT的应用程序典型地拥有9个预定义段(节),它们是“.text”、“.bss”、“.rdata”、“.data”、“.rsrc”、“.edata”、“.idata”、“.pdata”和“.debug”。一些应用程序不需要所有的这些段,同样还有些应用程序为了自己特殊的需要而定义了更多的段。(每个段头部占40byte,我们这里也不需要所有的段,仅需3个段。) 通常我们是将PE整个结构分成四个部分,把MS-DOS MZ 头部和MS-DOS 实模式残余程序作为第一部分,可以称他为DOS部分,而PE文件标志、PE文件头、PE文件可选头三个部分作为第二部分,称之为PE头部分,因为这部分才是Windows下真正需要的部分,所以从PE文件标志开始才是真正的PE部分。各段头部是第三部分,称之为节表。它详细描述了PE文件中各个节的详细信息。最后就是各个节的实体部分了,称为节数据。 以上仅仅是对PE结构各部分的大体讲解。接下来再手写这个Hello World!程序过程中,我将详细介绍每个部分的含义。 首先准备一下工具,一个十六进制编辑器足以。我们这里使用VC++ 6.0所携带的十六进制编辑器,您也可以使用如WinHex等十六进制编辑工具。 打开VC,选择文件,新建菜单项,然后选择一个二进制文件,单击确定。一切就绪了,下面就开始手写可执行程序,如图2所示:

PE结构4——区段与代码类型

甲壳虫免杀VIP教程 https://www.360docs.net/doc/9713983700.html, 专业的免杀技术培训基地 我们的口号:绝对不一样的免杀教程!绝对不一样的实战体验!清晰的思路!细致全面的讲解!让你感到免杀原来可以这么简单! 动画教程只是起到技术交流作用.请大家不用利用此方法对国内的网络做破坏. 国人应该团结起来一致对外才是我们的责任.由此动画造成的任何后果和本站 无关. -------------------------------------------------------------------- 【免杀PE结构班】制作:Just41(carrieyz) 第四节【PE文件常见区段及其代码类型】 一、区段表的结构 PE文件格式中,所有的区段信息位于可选PE头之后。每个区段信息为40个字节长,并且没有任何填充信息。区段信息被定义为以下的结构: 学名:免杀技术说明大小LOADPE Name:区段名称,如".text" [8h] SizeOfRawData:RV A偏移大小[4h] VSize VirtualAddress:区段RV A起始地址[4h] VOffset PointerToRawData:区段物理偏移大小(偏移量)[4h] RSize PhysicalAddress:区段物理起始地址[4h] ROffset VirtualSize:真实长度[4h] PointerToRelocations:重定位的偏移[4h] PointerToLinenumbers:行号表的偏移[4h] NumberOfRelocations:重定位项数目[2h] NumberOfLinenumbers:行号表的数目[2h] Characteristics:区段属性[4h] 标志 计算方式: 区段表的文件偏移地址=PE头的文件偏移地址+14h+可选PE头大小+1 首先从0X3Ch处得到PE头的文件偏移地址,然后由PE头的文件偏移地址+14h得到可选PE头大小,再将上面三个数据相加再+1就得到区段表的文件偏移地址了。 VSize的大小只是效验下是否跨越下一个节了,或者是否超出了SizeOfImage,如果出现越界问题,提示非法32位应用程序,否则的话,它的值没有意义,节的大小不是由它决定的......对非最后一个节,按节间VOffset之差,最后一节用SizeOfImage-VOffset。

pe文件格式

pe文件格式:PE文件格式(1) 疯狂代码 https://www.360docs.net/doc/9713983700.html,/ ?:http:/https://www.360docs.net/doc/9713983700.html,/Waigua/Article60255.html 介绍说明:希望本文能够对初级入门CRACKER有定帮助翻译存在疏漏或者不准确希望来信指出感谢您指导!感谢看雪为我们提供这个交流平台让我们技术和时俱进!! 前言: PE("portableexecutable")文件格式是针对MSwindowsNT,windows95and win32s可执行 2进制代码(DLLsandprograms)在windowsNT内,驱动也是这个格式也可以用于对象文件和库 这个格式是Microsoft设计并在1993经过TIS(toolerfacestandard)委员会 (Microsoft,Intel,Borland,Watcom,IBM等)标准化了它基于在UNIX和VMS上运行对象文件和可执行文件COFF"commonobjectfileformat"格式 win32SDK包括个头文件包括对PE格式定义我将提及成员名和定义你也可能发现DLL文件"imagehelp.dll"非常有用它是NT部分但文档很少它些在"DeveloperNetwork"被描述 总览: 在PE文件开始我们可以发现MSDOS执行部分("stub");这使得任何个PE文件是有效DOS执行文件在DOS-stub的后是32位魔数0x00004550(IMAGE_NT_SIGNATURE).然后是个COFF格式文件头指明在何种机器上运行多少个节在里面连接时间是否是可执行文件或者DLL等DLL和可执行文件区别:DLL不能够启动只可以被其他可执行文件使用个可执行文件不能够连接到另个可执行文件 接着我们看到个可选文件头optionalheader(虽然叫“可选”它实际上直存在) COFF把可选文件头用于库不用于目标文件这里告诉我们文件如何被调入:起始地址预留堆栈数数据段尺寸 个有趣部分是尾巴上数据目录datadirectories这些目录包含指向节内数据指针例如如果文件有输出目录可以在成员IMAGE_DIRECTORY_ENTRY_EXPORT内发现个指针指向那个目录(目录描述结构->THUNKDATA结构->BYNAME结构)他将指向个节 在头后面是节头实际上节内容就是真正需要运行个所需要东西所有头和目录成员就是帮你找到它每个节有几个标志:对齐包含数据类型(化数据等)是否可以共享等及数据自身多数节含有个或多个通过“可选头”内数据目录项引用目录没有目录类型内容是化数据或者可执行代码(节是物理意义上内容组织目录是逻辑意义上内容

【翻译】“PE文件格式”1.9版 完整译文(附注释)

标题:【翻译】“PE文件格式”1.9版完整译文(附注释) 作者:ah007 时间: 2006-02-28,13:32:12 链接: https://www.360docs.net/doc/9713983700.html,/showthread.php?t=21932 $Id: pe.txt,v 1.9 1999/03/20 23:55:09 LUEVELSMEYER Exp $ PE文件格式系列译文之一---- 【翻译】“PE文件格式”1.9版完整译文(附注释) ========================================================= 原著:Bernd. Luevelsmeyer 翻译:ah007 [注意:本译文的所有大小标题序号都是译者添加,以方便大家阅读。圆圈内的数字是注释的编号,其中注释②译自微软的《PECOFF规范》,其它译自网络。----译者] 一、前言(Preface) ------------------ PE(“portable executable”,可移植的可执行文件)文件格式,是微软WindwosNT,Windows95和Win32子集①中的可执行的二进制文件的格式;在WindowsNT中,驱动程序也是这种格式。它还能被应用于各种目标文件②和库文件中。 这种文件格式是由微软设计的,并于1993年被TIS(tool interface standard,工具接口标准)委员会(由Microsoft,Intel,Borland,Watcom,IBM,等等组成)所批准,它明显的基于COFF文件格式的许多知识。COFF (“common object file fromat”,通用目标文件格式)是应用于好几种UNIX系统③和VMS④系统中的目标文件和可执行文件的格式。 Win32 SDK⑤中包含一个名叫的头文件,其中含有很多用于PE格式的#define和typedef定义。我将逐步地提到其中的很多结构成员名字和#define定义。 你也可能发现DLL文件“imagehelp.dll”很有用途,它是WindowNT的一部分,但其书面文件却很缺乏。它的一些功用在“Developer Network”(开发者网络)中有所描述。 二、总览(General Layout) ------------------------- 在一个PE文件的开始处,我们会看到一个MS-DOS可执行体(英语叫“stub”,意为“根,存根”);它使任何PE文件都是一个有效的MS-DOS可执行文件。 在DOS-根之后是一个32位的签名以及魔数0x00004550 (IMAGE_NT_SIGNATURE)(意为“NT签名”,也

PE文件加密方法

对于一个软件开发商来说,要想了解PE文件加密处理的技术,第一步必须要研究PE文件格式,研究PE文件格式不但可以给我们洞悉Windows结构的良机,而且对于如何去保护自己开发的软件,有非常好的帮助,那么PE文件能否加密呢?下面我们就给大家介绍一下如何给PE文件加密。 一、什么是PE文件 PE文件的意思就是Portable Executable(可移植的执行体)。它是Win32环境自身所带的执行体文件格式,它的一些特性继承自Unix的Coff(common object fileformat)文件格式。“portable executable”(可移植的执行体)意味着此文件格式是跨win32平台的,即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPU上PE执行体必然得有一些改变。所有win32执行体都使用PE文件格式,包括动态库NT的内核模式驱动程序(kernel?mode drivers)。EXE 与DLL的差别完全是语义上的,它们使用格式,其实都是PE文件格式。唯一的区别就是其中有一个字段标识出是EXE还是DLL,还有很多DLL的扩展比如OCX,CPL等都是PE文件格式。 二、PE文件加密 对被保护软件的可执行文件加密是软件保护产品的重要组成部分,一般的加密思路是对可执行文件进行加一层保护壳,即对原始文件的代码段、数据段、引入表和原始入口点等进行加密,只有在运行完加壳的代码,才对以上内容进行解密。对PE文件加密是软件开发商保护自己合法软件的一个重要步骤,它可以极大的提高被保护软件的安全性。下面介绍一下加过密的可执行文件的装载过程。

4各种文件格式的不同分析

JPEG/BMP/TIF/PNG四种图像格式有什么不同? 一、BMP格式 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。 二、GIF格式 GIF是英文Graphics Interchange Format(图形交换格式)的缩写。顾名思义,这种格式是用来交换图片的。事实上也是如此,上世纪80年代,美国一家著名的在线信息服务机构CompuServe针对当时网络传输带宽的限制,开发出了这种GIF图像格式。GIF格式的特点是压缩比高,磁盘空间占用较少,所以这种图像格式迅速得到了广泛的应用。最初的GIF 只是简单地用来存储单幅静止图像(称为GIF87a),后来随着技术发展,可以同时存储若干幅静止图象进而形成连续的动画,使之成为当时支持2D动画为数不多的格式之一(称为GIF89a),而在GIF89a图像中可指定透明区域,使图像具有非同一般的显示效果,这更使GIF风光十足。目前Internet上大量采用的彩色动画文件多为这种格式的文件,也称为GIF89a格式文件。此外,考虑到网络传输中的实际情况,GIF图像格式还增加了渐显方式,也就是说,在图像传输过程中,用户可以先看到图像的大致轮廓,然后随着传输过程的继续而逐步看清图像中的细节部分,从而适应了用户的"从朦胧到清楚"的观赏心理。目前Internet 上大量采用的彩色动画文件多为这种格式的文件。但GIF有个小小的缺点,即不能存储超过256色的图像。尽管如此,这种格式仍在网络上大行其道应用,这和GIF图像文件短小、下载速度快、可用许多具有同样大小的图像文件组成动画等优势是分不开的。 三、JPEG格式 JPEG也是常见的一种图像格式,它由联合照片专家组(Joint Photographic Experts Group)开发并以命名为"ISO10918-1",JPEG仅仅是一种俗称而已。JPEG文件的扩展名为.jpg 或.jpeg,其压缩技术十分先进,它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像质量。同时JPEG还是一种很灵活的格式,具有调节图像质量的功能,允许你用不同的压缩比例对这种文件压缩,比如我们最高可以把1.37MB的BMP位图文件压缩至20.3KB。当然我们完全可以在图像质量和文件尺寸之间找到平衡点。由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。 四、JPEG2000格式 JPEG2000同样是由JPEG组织负责制定的,它有一个正式名称叫做"ISO15444",与JPEG相比,它具备更高压缩率以及更多新功能的新一代静态影像压缩技术。JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右。与JPEG不同的是,JPEG2000同时支持有损和无损压缩,而JPEG只能支持有损压缩。无损压缩对保存一些重要图片是十分有用的。JPEG2000的一个极其重要的特征在于它能实现渐进传输,这一点与GIF的"渐显"有异曲同工之妙,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的JPEG一样,由上到下慢慢显示。此外,JPEG2000还支持所谓的"感兴趣区域"特性,你可以任意指定影像上你感兴趣区域的压缩质

PE文件格式分析及修改

PE文件格式分析及修改(图) PE 的意思是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行文件格式。它的一些特性继承自Unix的Coff(common object file format)文件格式。“Portable Executable”(可移植的执行体)意味着此文件格式是跨Win32平台的;即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。 PE文件在文件系统中,与存贮在磁盘上的其它文件一样,都是二进制数据,对于操作系统来讲,可以认为是特定信息的一个载体,如果要让计算机系统执行某程序,则程序文件的载体必须符合某种特定的格式。要分析特定信息载体的格式,要求分析人员有数据分析、编码分析的能力。在Win32系统中,PE 文件可以认为.exe、.dll、.sys 、.scr类型的文件,这些文件在磁盘上存贮的格式都是有一定规律的。 一、PE格式基础 下表列出了PE的总体结构 一个完整的PE文件,前五项是必定要有的,如果缺少或者数据出错,系统会拒绝执行该文件如下图

DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS 下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。 DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。 PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。 Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。 二、程序的装入 当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示

PE文件格式对定位病毒特征码的作用

摘要:电脑病毒时刻在网络中传播,影响人们的生活和工作。本文根据杀毒软件查杀电脑病毒的过程和原理,分析pe文件格式在查杀病毒过程中所起的作用。 关键词:pe文件格式;杀毒软件;病毒 中图分类号:tp309.5 文献标识码:a 文章编号:1007-9599(2013)01-0067-02 1 引言 互联网时代,病毒在网络上到处传播,窃取用户信息,破坏用户数据。杀毒软件起着“伸张正义”的角色,对病毒的破坏行为进行拦截和对病毒进行查杀。杀毒软件和病毒之间的关系是矛与盾的较量关系。虽然杀毒软件处于强者地位,一直在追杀着病毒,然而杀毒软件却是一个被动的强者。杀毒软件永远都是在病毒出现后才知道去追杀(杀毒软件预知病毒能力目前还不是很强),而病毒发现自己被追杀后,也会通过伪装、隐藏、变种等方式来躲过杀毒软件的查杀。 面对病毒的伪装、隐藏、变种,杀毒软件如何能准确而快速的对病毒进行查杀呢?本文从杀毒软件查杀病毒的原理出发,分析pe文件格式在杀毒软件定位病毒特征码中的作用。杀毒软件通过快速准确定位病毒特征码,对伪装、隐藏、变种病毒进行查杀。 2 杀毒软件查杀病毒的原理概述 2.1 电脑病毒 对于操作系统来说,电脑病毒和其他应用程序是没有差别的,都是一个exe程序。只是功能上有所区别,通常病毒程序的功能是窃取用户信息、破坏电脑中的数据等,而一般的应用程序不会这么做。 2.2 杀毒软件查杀病毒的原理及特征码的作用 由于电脑病毒也是一个exe程序,杀毒软件怎样判断一个exe程序是一个病毒程序呢? 通常是先经过杀毒软件公司的技术人员来分析,验证某程序是否具有窃取用户信息,破坏电脑数据的行为。如果有,则认为是病毒程序。在确定为病毒程序后,则需要提取该病毒文件的特征码并把特征码录入病毒库。如果杀毒软件遇上某程序文件的特征码存在于病毒库中,那么杀毒软件则判断该程序文件是一个病毒文件。从这里可以看出来,杀毒软件对病毒文件的判断主要就是通过特征码比较来判断的。 世界上有无数的exe应用程序,如果某一个非病毒程序文件与一个病毒程序文件有相同的特征码,那么杀毒软件就是“杀错好人”了。“杀错好人”的情况就是“误杀”。 一个病毒程序也可能有无数个变种,如果某一个病毒,杀毒软件只杀了第一次出现时病毒版本,而不杀它的变种版本,那么杀毒软件就是“放走坏人”了。“放走坏人”的情况就是“漏杀”。 为了减少误杀和漏杀,特征码可能不止一个,而是一组。一组特征码按照一定的排列组合来确定某程序文件是否为病毒,这样会大大减少误杀的情况。然而增加特征码的个数会增加特征码的对比次数,从而增加查杀时间。 从杀毒软件查杀病毒的原理可以知道,杀毒软件杀毒的过程中有如下矛盾: 减少“查杀时间”,那就需要减少特征码的个数,但是这样子会提高“误杀率”和“漏杀率”。 为了降低“误杀率”和“漏杀率”,需要增加特征码的个数,但是这样子会增多“查杀时间”。 也就是说“查杀时间”与“误杀率”是一对矛盾。而其中解决这对矛盾的关键因素就是特征码的个数了。 针对这对矛盾,杀毒软件需要做的事情就是要定位出精准和稳定的特征码。定位出精准和稳定的特征码就是要找到最少的特征码来标识一个病毒,而且要这些特征码在病毒的变种

PE结构详解(64位和32位的差别)

1 基本概念下表描述了贯穿于本文中的一些概念:

图1 解释了Microsoft PE可执行文件格式: PE文件总体上分为“头”和“节”。“头”是“节”的描述、简化、说明,“节”是“头”的具体化。 3 文件头 PE文件的头分为DOS头、NT头、节头。注意,这是本人的分法,在此之前并没有这种分法。这样分法会更加合理,更易理解。因为这三个部分正好构成SizeOfHeaders所指的范围,所以将它们合为“头”。这里的3个头与别的文章的头的定义会有所区别。 节头紧跟在NT头后面。 3.1 DOS头(PE文件签名的偏移地址就是大小) 用记事本打开任何一个镜像文件,其头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文件都是这个值。MS-DOS程序是可有可无的,如果你想使文件大小尽可能的小可以省掉MS-DOS程序,同时把前面的参数都清0。 3.2 NT头(244或260个字节) 紧跟着PE文件签名之后,是NT头。NT头分成3个部分,因为第2部分在32与64位系统里有区别,第3部分虽然也是头,但实际很不像“头”。 第1部分(20个字节) 第2部分(96或112个字节)

PE文件格式实验

PE文件格式分析实验 使用工具LordPE/PEview、winhex 选择一个exe或者DLL文件 阶段一:(本次实验) 1.DOS头部查看、对应DOS头结构进行数据逐项分析 2.PE头部查看、对应PE头结构进行数据逐项分析 3.Exe文件和DLL文件均是PE格式,他们的区别在哪里? 4.Section表结构的查看(是否可以增加一个新的section表?对齐边界是多少?) 5.PE文件section查看、对应section 块表结构进行数据分析 6.VA、RVA、RA计算 7.问题:你查看的PE文件DOS、PE头部的空隙是多大? 8.问题:你查看的PE文件在那个section的空隙最大/最小? 9.问题:如果手工增加一个section,要修改哪些字段,请手工试验。(提高:你的新块表 增加是否引起原文件的对齐位置的改变?) 10.问题(提高):一个section的属性字节如何设置,请在上一个问题基础上实验。 本次实验要求对照以上要求,自行选择文件进行分析,撰写报告。 阶段二:(后一阶段的工作) 1.资源查看、修改 2.编写PE文件分析程序 3.编写PE病毒程序 附录1PE格式详细讲解(一) 前几天发了一个PE信息查看器的小工具,本来想用那个获取邀请码的,可是觉得几率不是太大,于是再献上一篇教程,既是为了自己能获得邀请码,也是帮助那些想学习PE格式的人,让知识来源于网络再回归网络。 N年没写文章了,不知道句子还能不能写通顺,最近正在看《软件加密技术内幕》,刚看完PE结构那部分内容,所以想起来写篇教程作为读书笔记,既可加强记忆又可帮助别人,何乐而不为呢。 好了,废话少说好戏正式上场,PE是英文Portable Executable(可移植的执行体)的缩写,从缩写可以看出它是跨平台的,即使在非intel的CPU上也能正常运行的。它是 Win32环境自身所带的执行体文件格式。其实不光是EXE文件是PE格式,其它的一些重要文件,例如动态链接库文件(DLL),驱动文件(SYS)等也是PE格式的,所以学好PE格式是非常重要的,以下我把这类文件统称为PE文件。学习PE文件结构不仅可以使我们知道可执行文件是怎样运行的,也可以使我们了解一下windows操作系统的一些工作机制,精通PE是成为计算机高手的必经之路。 其实说白了PE文件格式就是一种文件组织的方式,里面对一些重要信息的存放做了一些规定,比如文件要运行,我们就得先知道入口地址,可是我们从哪去得到入口地址呢,我们必须把保存有入口地址信息

PE文件各区段说明

PE文件各节所包含的内容 2008-11-13 13:34 关于 sections 的意义以及它如何定位,相信你已有个概念。现在我们要看看在EXE 和OBJ 档中的一些常见的 sections 。虽然我所列的并不是全部,但已经涵盖了你每天会接触到(但也许你自己并不知道)的 sections 。排列次序是根据其重要性以及遭遇它们的频繁度。 .text section .text 内含所有一般性的程序代码。由于 PE 文件在 32 位模式下跑,并且不受约束于 16 位元节区,所以没有理由把程序代码分开放到不同的 sections 中。联结器把所有来自 .OBJ的 .text 集合到一个大的 .text 中。如果你使用Borland C++,其编译器制作出来的 code section 名为 CODE 而不是 .text 。请看稍后「Borland CODE 以及 .icode sections 」一节。 我很惊讶地发现,在 .text 中除了编译器制作出来的码,以及runtime library 的码之外, 还有一些其它东西。在 PE 文件中,当你呼叫另一模块中的函数(例如 USER32.DLL 中 的 GetMessage ),编译器制造出来的 CALL 指令并不会把控制权直接传给 DLL 中的 函数,而是传给一个JMP DWORD PTR [XXXXXXXX]指令,后者也位于 .text 中。JMP 指 令跳到一个地址去,此地址储存在 .idata 的一个 DWORD 之中。这个DWORD 内含该 函数的真正地址(函数进入点),如图8-4 所示。

图8-4 一个 PE 档呼叫 imported function 。 沉思良久,我终于了解为什么 DLL 的呼叫需要以这种方式实现。把对同一个DLL 函数 的所有呼叫都集中到一处,加载器就不再需要修补每一个呼叫 DLL 的指令。PE 加载器 需要做的,就只是把 DLL 函数的真实地址放到 .idata 的那个 DWORD 之中,根本就 没有程序代码需要修补。这和 NE 档有极明显的差异。NE 档的每一个节区内含一串待修 正记录(fixup records ),如果某一节区呼叫同一个 DLL 函数 20 次,加载器就必须忙 碌 20 次,将函数地址拷贝到待修正记录之中。PE 档这种处理方式也有缺点:你不能够 以 DLL 函数的真正地址初始化一个变量。例如: FARPROC pfnGetMessage = GetMessage; 是把 GetMessage 函数地址放到 pfnGetMessage 变量中。在 Win16 这没问题,在 Win32 ,变量中放的其实将是稍早我说过的JMP DWORD PTR [XXXXXXXX]指令的地址。如 果你根据这个函数指针来呼叫函数,事情会如你所预期。但如果你要以此指针读取 GetMessage 的前数个字节,幸运之神不会站在你那边。稍后我将在「PE 文件的输出 (exports )」一节中再继续讨论这个主题。 在我写完本章的第一个版本之后,Visual C++ 2.0 推出了。它介绍另一种新的呼叫方式。 如果你看过 Visual C++ 2.0 的系统表头文件(例如 WINBASE.H ),你将看到和过去不同 的东西。在 Visual C++ 2.0 中,API 函数原型都有一个 __declspec(dllimport )作为原型 的一部份。当你呼叫一个这样的函数,编译器不会在模块的另一个地方产生JMP DWORD PTR [XXXXXXXX]指令,而是产生一个CALL DWORD PTR [XXXXXXXX]函数呼叫。XXXXXXXX 位 址位于 .idata 内,作用与原先在JMP DWORD PTR [XXXXXXXX]指令中的地址相同。就我 所知,Borland C++ 4.5 编译器并没有这样的性质。 Borland CODE 以及 .icode sections

PE文件结构详解

PE文件结构详解 1 摘要 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文件格式的。 2 介绍 Windows操作系统家族最近增加的Windows NT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。新的PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。 在本文之中,PE文件格式是以自顶而下的顺序解释的。在你从头开始研究文件内容的过程之中,本文会详细讨论PE文件的每一个组成部分。 很多解决PE文件格式的工作和直接观看数据有关。例如,要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像数据目录、可选头部以及当前的.idata段实体,而EXEVIEW.EXE就是查看这些信息的最佳示例。 在针对PE文件的有关编程中,你可能用到以下一些数据结构: IMAGE_DOS_HEADER IMAGE_IMPORT_DESCRIPTOR IMAGE_NT_HEADERS IMAGE_SECTION_HEADER IMAGE_OPTIONAL_HEADER IMAGE_DA TA_DIRECTORY IMAGE_FILE_HEADER 3 PE文件结构图

相关主题
相关文档
最新文档