|
本贴原名叫:有没有玩破解的人--WIN7相关
====
本人写此贴的初衷主要是想在硬盘/USB盘上定制安装WIN7系统,摆脱WIN7根目录的众多文件夹,经过无数的失败,终于达到了自己的目的。
在开始这前,要感谢chenall, fujianabc和老九等人的讨论,尤其感谢chenall在关键时候帮助破解了难题。
进入正题
大家都知道,VISTA及以上系统其光盘结构为:
autorun.inf
setup.exe
bootmgr
<boot>
<efi>
<sources>
<support>
<upgrade>
其中:
setup.exe是在WIN下进行安装WIN7的程序
autorn.inf是光盘自动运行文件,插入光盘会通过它运行setup.exe
<boot>文件夹,最重要,含有启动NT6以上系统的启动配置文件BCD(相当于XP的boot.ini),挂载WIM的BOOT.SDI、内存检测和字体等工具
<efi>文件夹,EFI主板启动支持
<support>和<upgrade>就不用说了,是支持和升级相关文件夹。
<sources>,最重要,含有PE文件boot.wim和install.wim,以及在WIN下启动setup所需的文件。
我现在想做的就是把这些文件统计整理到一个文件中进行安装,这里假设我们将所有文件都弄到BOOT文件夹中,操作步骤如下:
1. 更改boot.wim文件的路径
这需要编辑BCD文件,我们使用bcdedit.exe(XP下也可以运行)
先运行:
bcdedit /store BCD文件路径 /enum all /v
Windows 启动管理器
--------------------
标识符 {9dea862c-5cdd-4e70-acc1-f32b344d4795}
description Windows Boot Manager
locale en-US
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
default {7619dcc9-fafe-11d9-b411-000476eba25f}
displayorder {7619dcc9-fafe-11d9-b411-000476eba25f}
toolsdisplayorder {b2721d73-1db4-4c62-bf78-c548a880142d}
timeout 30
Windows 启动加载器
-------------------
标识符 {7619dcc9-fafe-11d9-b411-000476eba25f}
device ramdisk=[boot]\sources\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
path \windows\system32\boot\winload.exe
description Windows Setup
locale en-US
inherit {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
osdevice ramdisk=[boot]\sources\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
systemroot \windows
detecthal Yes
winpe Yes
ems Yes
Windows 内存测试程序
---------------------
标识符 {b2721d73-1db4-4c62-bf78-c548a880142d}
device boot
path \boot\memtest.exe
description Windows Memory Diagnostic
locale en-US
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
EMS 设置
------------
标识符 {0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}
bootems Yes
调试器设置
-----------------
标识符 {4636856e-540f-4170-a130-a84776f4c654}
debugtype Serial
debugport 1
baudrate 115200
全局设置
---------------
标识符 {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
inherit {4636856e-540f-4170-a130-a84776f4c654}
{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}
启动加载器设置
--------------------
标识符 {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
{7ff607e0-4395-11db-b0de-0800200c9a66}
虚拟机监控程序设置
-------------------
标识符 {7ff607e0-4395-11db-b0de-0800200c9a66}
description Hypervisor Settings
hypervisordebugtype Serial
hypervisordebugport 1
hypervisorbaudrate 115200
设备选项
--------------
标识符 {7619dcc8-fafe-11d9-b411-000476eba25f}
ramdisksdidevice boot
ramdisksdipath \boot\boot.sdi
这里我们要改变boot.wim的路径,运行如下命令,
bcdedit /store BCD文件路径 /set {default} device ramdisk=[boot]\boot\sources\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
同上,将上述的device改成osdevice,再运行一次。
因为我们改变了SOURCES目录的路径,因此还要让PE能找到install.wim文件,要进行下述第2步操作
2.修改startnet.cmd文件
这个文件位于boot.wim第2个映像的windows\system32目录下。
PE启动时会在X:\SOURCES目录下寻找setup.exe文件来进行安装, 如果SOURCES目录没有SETUP.EXE,那么winpeshl.exe会执行system32目录下的winpeshl.ini所指定的文件。如果winpeshl.ini没有指定程序或没有此文件,那么winpeshl.exe将会执行system32目录下的startnet.cmd文件,默认PE下存在此文件,会加载网络配置。我们解决这个boot.wim,可以使用imagex也可以使用sources目录的dism.exe。把这个文件内容变成:
@echo off
for %%a in (c d e f g h i j k l m n o p q r s t u v w y z) do (if exist %%a:\boot\sources\install.wim x:\sources\winsetup.exe /installfrom:%%a:\boot\sources\install.wim)
exit
当然,要把setup.exe重命名为winsetup.exe
看到了吧,这个setup.exe可以有参数installfrom,有了它,我们就可以指定wim文件的位置了。
修改完毕:imgaex /unmount /commit 挂载的目录
使用grldr启动系统,chainloder /boot/bootmgr来实现启动或安装系统。
合盘
比如把VISTA、WIN7和2008 R2全部放到一个盘来安装,这些盘目录结构都一致,我们该怎么办呢?
当然我样可以通过配置BCD文件来指定boot.wim的位置,也可以将sources目录换成其它名字,可是这样非常的不爽,原因在于我们要通过BCD菜单来选单,没有直接bootmgr启动进入安装直接,我们该如何操作呢?
加注:有关合盘,可以参考微软的方法:Cross-Platform Deployment http://technet.microsoft.com/en-us/library/cc721953(WS.10).aspx
我们可以通过不同的BCD文件来实现直接启动不同的系统。
一切的入手点在于bootmgr这个文件,它是启动管理器,类似于XP的NTLDR,所不同的是这个文件即有CHECKSUM校验,又有数字签名验证,要修改它,必须解决这两个问题
国外的高手解决了checksum问题(http://www.boot-land.net/forums/index.php?showtopic=8043,6楼)
我们必须用VISTA SP0的BOOTMGR,用起文本编辑器打开,在0xe28处将7403更改为EB1A这样就去除了checksum校验。
在0x54b68处找到B.O.O.T.\.B.C.D,我们可以将BCD换成我们要的名字,例如VISTA使用BCD,WIN7使用7CD,2008使用8CD等。将这个bootmgr改名为你所需要的就可以了。
这样够了吗?不够,没有解决数字签名的问题,对于这个数字签名,国内有N人写了一篇文章(http://bbs.driverdevelop.com/htm_data/16/0711/106925.html),这篇文件解决了checksum和数字签名,可惜我“水平太潜”,用IDA如何也没有找到他所说的那几个函数,当然也无法修改。
用得着那么复杂的操作吗?用不着,国外的高手同样解决了数字签名问题,而且非常非常的签单,但他们只想到的是PXE启动PE,即用于bootmgr.exe启动过程,经过我试验,这个方法同样对bootmgr有效:
打开BCD文件,运行:bcdedit /store BCD文件 /set {bootmgr} nointegritychecks yes
OK,数字签名问题搞定。
说到这里,你可能要问,为什么不把bootmgr中的boot也给改名了?是的,我也尝试过,可是就是不成功,bootmgr里面所有出现boot的地方都改了,可是就是无法启动。
同样,如果你厉害,可以把sources目录的setup.exe或winsetup.dll也给改了,让它不用通过installfrom参数一指定WIM文件,可以直接启动安装。这个setup.exe没有checksum也没有数字签名,IDA打开,有PDB表,修改应该容易些。我尝试着改winsetup.dll失败了。可能你感兴趣,会IDA,那么说不定你会成功。
说到这里,你可能感到不爽,把SOURCES目录放到BOOT里,有什么用啊?目录结构与原来还不一致了,别急,下面告诉你一个比较好的方案:
把WIN7.ISO里面的install.wim放到U盘,参照微软的这篇文章HOW WIN PE WORKS(http://technet.microsoft.com/en-us/library/cc721977(WS.10).aspx),不修改startnet.cmd文件,添加一个winpeshl.ini文件,其内容为启动同目录下的setup.cmd文件,后者的内容同上述第2步的startnet.cmd,winpeshl.ini文件的内容为:
[launchapps]
x:\windows\system32\setup.cmd
另外,还要把sources目录的setup.exe更名为winsetup.exe。把修改后的boot.wim放入ISO中,直接
map ISO文件 (hd32)
chainloader (hd32)
boot 启动即可,这样我们可以随意把ISO和install.wim文件放到想放的位置。
还有没有更灵活的方法了?有的,chenall最终破解了将BOOT.WIM放到与BOOTMGR不在同一介质安装方法,同时经过测试,我俩还研究明白了BCD对畸形目录的写法。
OK, 现在假设把BOOT.WIM和INSTATLL.WIM同到到U盘的一个根目录下面,我们可以只留一个WIN7 ISO去除这两个文件的ISO,则我们必须修改BCD文件,因为这里的BOOT.WIM已经与ISO不在同一盘上了:
一切的问题根本在这个BCD文件,如果从与BOOTMGR非同一分区或介质上以RAMDISK启动BOOT.WIM,那么我们需要设定这个BOOT.WIM文件的路径的,光盘BCD目录默认其在SOURCES目录,且启动盘为BOOT,这个BOOT名字是很特殊的设备,是从光盘的BCD里发现的。为此,CHENALL专门写了一篇文章“单击打开:【分享】小技巧,两条命令解决WIN7安装后改MBR启动失败问题”,这是一个重要发现,将硬盘BCD文件启动区设置为BOOT后,MBR怎样改都不会出错。这样的问题最早PT在时空论坛遇到过(单击打开:修复 win 7 引导的一些经验),最后是FUJIANABC给出的解决办法,对比这个办法,还是CHENALL的简单、一劳永逸。
以上是我说的一个插曲,下面我继续说,如何从BCD入手去解决问题,在上面PT的贴子里已经提到了BCD文件是记录MBR和分区信息的,这非常的重要,我当初这所以失败,就是因为只考虑了盘符,不知道还有MBR的问题。解决方法就是先启动WIN系统,比如在PE下,假设你的U盘盘符为C:,那么,你就设置device和osdevice的rmadisk=[C:]\XX,U盘符是什么这里就设置什么,只这样做还不够,还必须改BOOT.SDI的盘符和路径,将ramdisksdidevice设置为=U盘的盘符,好了,你现在能正确启动BOOT.WIM,因为这时BCDEDIT在BCD文件中记录了磁盘的DISK SIGNATURE和分区的起始偏移,盘符只是个代码,BCD里记录的DISK SIGNATURE和OFFSET值才最终决定你是从什么盘什么分区指定DEVICE和OSDEVICE的。另外请参考本人在PE区发的“注册表与盘符”一文,会对DISK SIGNATURE和OFFSET有深入的了解。
对于畸形目录,有一个发现,比如本人的U盘为NTFS系统,dir显示畸形目录名为dat.,我当初在BCD中指定路径时都是使用的dat~1来代替,结果就是不成功,在CHENALL的提醒下,直接使用dat.做为路径名称就成功了。
本人目前的U盘就是把所有的WIN7相关的文件都放入了畸形目录,但没有使用去除了两个WIM文件的ISO,因为感觉体积还是大,就只保留了BOOTMGR和BOOT目录以及下面的BCD和MEMTEST文件,其余的都不要,做了一个1.4M的IMG,启动进直接将其MAP成FD0,再CHAINLOADER (FD0)/BOOTMGR就可以了。
全文完 20091103
[ 本帖最后由 victor888 于 2010-2-11 12:39 编辑 ] |
|