请发一下《deputy directorr交互式多媒体开发从新手到高手》的光盘

首先说的是对win没有要求的单独┅个分区就够了的用户

1 在mac下找到bootcamp进行分区(分区时候会提示要下载驱动并刻录到光盘,我们不需要选这个因为这些在买的光盘中就自带叻的)

2 根据您自己的需要决定磁盘分区的大小(记住,常用win的请把win这个磁盘分大点因为以后系统文件和你装的应用程序、游戏都会在这個文件夹中了的)

3 点击下一步,插入win7光盘电脑会自己重启,然后进入win7的安装界面(win7大家都会装吧)注:当进入选择磁盘安装的时候请選择有bootcamp标注的磁盘,请先格式化bootcamp磁盘再安装

4 等win7安装完成后取出光盘,放入电脑自带的光盘(mac os x install DVD)来安装驱动

5安装完后去苹果官网下载最新嘚bootcamp(这步好像要在mac系统下操作一直没弄明白是为什么)给大家一个连接吧

6到这里就基本安装完成了,但要是您安装完win7之后出现黑屏那請你把win7光盘放入电脑然后进入安装界面,不是重新安装而是选择修复计算机这一个选项

以上方法给大家一个视频地址吧

然后再说下对win7有特殊要求的用户,就是需要win7分两个盘一个是系统盘还有一个是放自己安装的软件文件这一类东西的盘

发布了0 篇原创文章 · 获赞 0 · 访问量 188

}

该楼层疑似违规已被系统折叠 

你恏请问下这个光盘的内容你还有吗,能不能发给我一下谢谢啦


}

   然而这一的文档并未提供足夠的信息所以开发者们无法很好地弄懂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文件结构足够的定义在这种情况下,我定义了自己嘚结构来存取文件数据你会在PEFILE.DLL工程的PEFILE.H中找到这些结构的定义,整套的PEFILE.H开发文件包含在PEFile示例程序之中 
本文配套的示例程序除了PEFILE.DLL示例代码の外,还有一个单独的Win32示例应用程序名为EXEVIEW.EXE。创建这一示例目的有二:首先我需要测试PEFILE.DLL的函数,并且某些情况要求我同时查看多个文件;其次很多解决PE文件格式的工作和直接观看数据有关。例如要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像數据目录、可选头部以及当前的.idata段实体而EXEVIEW.EXE就是查看这些信息的最佳示例。 
   闲话少叙让我们开始吧。

PE文件格式被组织为一个线性的數据流它由一个MS-DOS头部开始,接着是一个是模式的程序残余以及一个PE文件标志这之后紧接着PE文件头和可选头部。这些之后是所有的段头蔀段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据我将所有这些成分列于图1。

图1.PE文件映像结构

从MS-DOS文件头结构开始我将按照PE文件格式各成分的出现顺序依次对其进行讨論,并且讨论的大部分是以示例代码为基础来示范如何获得文件的信息的所有的源码均摘自PEFILE.DLL模块的PEFILE.C文件。这些示例都利用了Windows NT最酷的特色の一――内存映射文件这一特色允许用户使用一个简单的指针来存取文件中所包含的数据,因此所有的示例都使用了内存映射文件来存取PE文件中的数据

注意:请查阅本文末尾关于如何使用PEFILE.DLL的那一段。

如上所述PE文件格式的第一个组成部分是MS-DOS头部。在PE文件格式中它并非┅个新概念,因为它与MS-DOS 2.0以来就已有的MS-DOS头部是完全一样的保留这个相同结构的最主要原因是,当你尝试在Windows 3.1以下或MS-DOS 2.0以上的系统下装载一个文件的时候操作系统能够读取这个文件并明白它是和当前系统不相兼容的。换句话说当你在MS-DOS

MS-DOS头部占据了PE文件的头64个字节,描述它内容的結构如下:

第一个域e_magic被称为魔术数字,它被用于表示一个MS-DOS兼容的文件类型所有MS-DOS兼容的可执行文件都将这个值设为0x5A4D,表示ASCII字符MZMS-DOS头部之所以有的时候被称为MZ头部,就是这个缘故还有许多其它的域对于MS-DOS操作系统来说都有用,但是对于Windows NT来说这个结构中只有一个有用的域――最后一个域e_lfnew,一个4字节的文件偏移量PE文件头部就是由它定位的。对于Windows NT的PE文件来说PE文件头部是紧跟在MS-DOS头部和实模式程序残余之后的。

實模式残余程序是一个在装载时能够被MS-DOS运行的实际程序对于一个MS-DOS的可执行映像文件,应用程序就是从这里执行的对于Windows、OS/2、Windows NT这些操作系統来说,MS-DOS残余程序就代替了主程序的位置被放在这里这种残余程序通常什么也不做,而只是输出一行文本例如:“This program requires Microsoft

当为Windows 3.1构建一个应用程序的时候,链接器将向你的可执行文件中链接一个名为WINSTUB.EXE的默认残余程序你可以用一个基于MS-DOS的有效程序取代WINSTUB,并且用STUB模块定义语句指示鏈接器这样就能够取代链接器的默认行为。为Windows NT开发的应用程序可以通过使用-STUB:链接器选项来实现

PE文件头部是由MS-DOS头部的e_lfanew域定位的,这个域呮是给出了文件的偏移量所以要确定PE头部的实际内存映射地址,就需要添加文件的内存映射基地址例如,以下的宏是包含在PEFILE.H源文件之Φ的:

在处理PE文件信息的时候我发现文件之中有些位置需要经常查阅。既然这些位置仅仅是对文件的偏移量那么用宏来实现这些定位僦比较容易,因为它们较之函数有更好的表现

请注意这个宏所获得的是PE文件标志,而并非PE文件头部的偏移量那是由于自Windows与OS/2的可执行文件开始,.EXE文件都被赋予了目标操作系统的标志对于Windows NT的PE文件格式而言,这一标志在PE文件头部结构之前在Windows和OS/2的某些版本中,这一标志是文件头的第一个字同样,对于PE文件格式Windows NT使用了一个DWORD值。

以上的宏返回了文件标志的偏移量而不管它是哪种类型的可执行文件。所以攵件头部是在DWORD标志之后,还是在WORD标志处是由这个标志是否Windows NT文件标志所决定的。要解决这个问题我编写了ImageFileType函数(如下),它返回了映像攵件的类型:

以上列出的代码立即告诉了你NTSIGNATURE宏有多么有用对于比较不同文件类型并且返回一个适当的文件种类来说,这个宏就会使这两件事变得非常简单WINNT.H之中定义的四种不同文件类型有:

首先,Windows的可执行文件类型没有出现在这一列表中这一点看起来很奇怪。但是在稍微研究一下之后,就能得到原因了:除了操作系统版本规范的不同之外Windows的可执行文件和OS/2的可执行文件实在没有什么区别。这两个操作系统拥有相同的可执行文件结构

现在把我们的注意力转向Windows NT PE文件格式,我们会发现只要我们得到了文件标志的位置PE文件之后就会有4个字節相跟随。下一个宏标识了PE文件的头部:

这个宏与上一个宏的唯一不同是这个宏加入了一个常量SIZE_OF_NT_SIGNATURE不幸的是,这个常量并未定义在WINNT.H之中於是我将它定义在了PEFILE.H中,它是一个DWORD的大小

既然我们知道了PE文件头的位置,那么就可以检查头部的数据了我们只需要把这个位置赋值给┅个结构,如下:

在这个例子中lpFile表示一个指向可执行文件内存映像基地址的指针,这就显出了内存映射文件的好处:不需要执行文件的I/O只需使用指针pfh就能存取文件中的信息。PE文件头结构被定义为:

请注意这个文件头部的大小已经定义在这个包含文件之中了这样一来,想要得到这个结构的大小就很方便了但是我觉得对结构本身使用sizeof运算符(译注:原文为“function”)更简单一些,因为这样的话我就不必记住這个常量的名字IMAGE_SIZEOF_FILE_HEADER而只需要记住结构IMAGE_FILE_HEADER的名字就可以了。另一方面记住所有结构的名字已经够有挑战性的了,尤其在是这些结构只有WINNT.H中才囿的情况下

PE文件中的信息基本上是一些高级信息,这些信息是被操作系统或者应用程序用来决定如何处理这个文件的第一个域是用来表示这个可执行文件被构建的目标机器种类,例如DEC(R) Alpha、MIPS R4000、Intel(R) x86或一些其它处理器系统使用这一信息来在读取这个文件的其它数据之前决定如何處理它。

Characteristics域表示了文件的一些特征比如对于一个可执行文件而言,分离调试文件是如何操作的调试器通常使用的方法是将调试信息从PE攵件中分离,并保存到一个调试文件(.DBG)中要这么做的话,调试器需要了解是否要在一个单独的文件中寻找调试信息以及这个文件是否已经将调试信息分离了。我们可以通过深入可执行文件并寻找调试信息的方法来完成这一工作要使调试器不在文件中查找的话,就需偠用到IMAGE_FILE_DEBUG_STRIPPED这个特征它表示文件的调试信息是否已经被分离了。这样一来调试器可以通过快速查看PE文件的头部的方法来决定文件中是否存茬着调试信息。

WINNT.H定义了若干其它表示文件头信息的标记就和以上的例子差不多。我把研究这些标记的事情留给读者作为练习由你们来看看它们是不是很有趣,这些标记位于WINNT.H中的IMAGE_FILE_HEADER结构之后

PE文件头结构中另一个有用的入口是NumberOfSections域,它表示如果你要方便地提取文件信息的话僦需要了解多少个段――更明确一点来说,有多少个段头部和多少个段实体每一个段头部和段实体都在文件中连续地排列着,所以要决萣段头部和段实体在哪里结束的话段的数目是必需的。以下的函数从PE文件头中提取了段的数目:

如你所见PEFHDROFFSET以及其它宏用起来非常方便。

PE可执行文件中接下来的224个字节组成了PE可选头部虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针:

可选头部包含了很多关于可执行映像的重要信息例如初始的堆栈大小、程序入口点的位置、首选基哋址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下:

如你所见这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感箌厌烦我会仅仅讨论有用的――就是说,对于探究PE文件格式而言有用的

首先,请注意这个结构被划分为“标准域”和“NT附加域”所謂标准域,就是和UNIX可执行文件的COFF格式所公共的部分虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的――尽管换个名芓更好一些

?Magic。我不知道这个域是干什么的对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B或267(译注:0x010B为.EXE0x0107为ROM映像,这个信息我是从eXeScope上得来的)

?AddressOfEntryPoint。在标准域中AddressOfEntryPoint域是对PE文件格式来说最为有趣的了。这个域表示应用程序入口点的位置并且,对于系统黑客来说这个位置就是導入地址表(IAT)的末尾。以下的函数示范了如何从可选头部获得Windows NT可执行映像的入口点

?BaseOfCode。已载入映像的代码(“.text”段)的相对偏移量

?BaseOfData。已载入映像的未初始化数据(“.bss”段)的相对偏移量

添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述

?SectionAlignment。从ImageBase开始每个段都被相继的装入进程的地址空间中。SectionAlignment则规定了装载时段能够占据的最小空间数量――就是说段是关于SectionAlignment對齐的。

Windows NT虚拟内存管理器规定段对齐不能少于页尺寸(当前的x86平台是4096字节),并且必须是成倍的页尺寸4096字节是x86链接器的默认值,但是咜可以通过-ALIGN: linker开关来设置

?FileAlignment。映像文件首先装载的最小的信息块间隔例如,链接器将一个段实体(段的原始数据)加零扩展为文件中最接近的FileAlignment边界早先提及的2.39版链接器将映像文件以0x200字节的边界对齐,这个值可以被强制改为512到65535这么多

?Reserved1。未知目的通常不被系统使用,並被链接器设为0

?SizeOfImage。表示载入的可执行映像的地址空间中要保留的地址空间大小这个数字很大程度上受SectionAlignment的影响。例如考虑一个拥有凅定页尺寸4096字节的系统,如果你有一个11个段的可执行文件它的每个段都少于4096字节,并且关于65536字节边界对齐那么SizeOfImage域将会被设为11 * 65536 = 45056(11页)。這只是个简单的例子它说明每个段需要少于一个页面的内存。在现实中链接器通过个别地计算每个段的方法来决定SizeOfImage确切的值。它首先決定每个段需要多少字节并且最后将页面总数向上取整至最接近的SectionAlignment边界,然后总数就是每个段个别需求之和了

?SizeOfHeaders。这个域表示文件中囿多少空间用来保存所有的文件头部包括MS-DOS头部、PE文件头部、PE可选头部以及PE段头部。文件中所有的段实体就开始于这个位置

?CheckSum。校验和昰用来在装载时验证可执行文件的它是由链接器设置并检验的。由于创建这些校验和的算法是私有信息所以在此不进行讨论。

?Subsystem用於标识该可执行文件目标子系统的域。每个可能的子系统取值列于WINNT.H的IMAGE_OPTIONAL_HEADER结构之后

?DllCharacteristics。用来表示一个DLL映像是否为进程和线程的初始化及终止包含入口点的标记

?LoaderFlags。告知装载器是否在装载时中止和调试或者默认地正常运行。

?NumberOfRvaAndSizes这个域标识了接下来的Datadeputy directorry数组。请注意它被用来標识这个数组而不是数组中的各个入口数字,这一点非常重要

?Datadeputy directorry。数据目录表示文件中其它可执行信息重要组成部分的位置它事实仩就是一个IMAGE_DATA_deputy directorRY结构的数组,位于可选头部结构的末尾当前的PE文件格式定义了16种可能的数据目录,这之中的11种现在在使用中

WINNT.H之中所定义的數据目录为:

基本上,每个数据目录都是一个被定义为IMAGE_DATA_deputy directorRY的结构虽然数据目录入口本身是相同的,但是每个特定的目录种类却是完全唯一嘚每个数据目录的定义在本文的以后部分被描述为“预定义段”。

每个数据目录入口指定了该目录的尺寸和相对虚拟地址如果你要定義一个特定的目录的话,就需要从可选头部中的数据目录数组中决定相对的地址然后使用虚拟地址来决定该目录位于哪个段中。一旦你決定了哪个段包含了该目录该段的段头部就会被用于查找数据目录的精确文件偏移量位置。

所以要获得一个数据目录的话那么首先你需要了解段的概念。我在下面会对其进行描述这个讨论之后还有一个有关如何定位数据目录的示例。

PE文件规范由目前为止定义的那些头蔀以及一个名为“段”的一般对象组成段包含了文件的内容,包括代码、数据、资源以及其它可执行信息每个段都有一个头部和一个實体(原始数据)。我将在下面描述段头部的有关信息但是段实体则缺少一个严格的文件结构。因此它们几乎可以被链接器按任何的方法组织,只要它的头部填充了足够能够解释数据的信息

PE文件格式中,所有的段头部位于可选头部之后每个段头部为40个字节长,并且沒有任何的填充信息段头部被定义为以下的结构:

你如何才能获得一个特定段的段头部信息?既然段头部是被连续的组织起来的而且沒有一个特定的顺序,那么段头部必须由名称来定位以下的函数示范了如何从一个给定了段名称的PE映像文件中获得一个段头部:

这个函數通过SECHDROFFSET宏将第一个段头部定位,然后它开始在所有段中循环并将要寻找的段名称和每个段的名称相比较,直到找到了正确的那一个为止当找到了段的时候,函数将内存映像文件的数据复制到传入函数的结构中然后IMAGE_SECTION_HEADER结构的各域就能够被直接存取了。

?Name每个段都有一个8芓符长的名称域,并且第一个字符必须是一个句点 

 ?VirtualAddress。这个域标识了进程地址空间中要装载这个段的虚拟地址实际的地址由将这个域嘚值加上可选头部结构中的ImageBase虚拟地址得到。切记如果这个映像文件是一个DLL,那么这个DLL就不一定会装载到ImageBase要求的位置所以一旦这个文件被装载进入了一个进程,实际的ImageBase值应该通过使用GetModuleHandle来检验 

 ?SizeOfRawData。这个域表示了相对FileAlignment的段实体尺寸文件中实际的段实体尺寸将少于或等于FileAlignment的整倍数。一旦映像被装载进入了一个进程的地址空间段实体的尺寸将会变得少于或等于FileAlignment的整倍数。 

 ?Characteristics定义了段的特征。这些值可以在WINNT.H忣本光盘(译注:MSDN的光盘)的PE格式规范中找到

0x 该段数据不能被缓存

 数据目录存在于它们相应的数据段中。典型地来说数据目录是段实體中的第一个结构,但不是必需的由于这个缘故,如果你需要定位一个指定的数据目录的话就需要从段头部和可选头部中获得信息。 

 為了让这个过程简单一点我编写了以下的函数来定位任何一个在WINNT.H之中定义的数据目录。

该函数首先确认被请求的数据目录入口数字然後它分别获取指向可选头部和第一个段头部的两个指针。它从可选头部决定数据目录的虚拟地址然后它使用这个值来决定数据目录定位茬哪个段实体之中。如果适当的段实体已经被标识了那么数据目录特定的位置就可以通过将它的相对虚拟地址转换为文件中地址的方法來找到。

}

我要回帖

更多关于 deputy director 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信