GRUB for DOS 磁盘仿真命令简介_大灰狼工作室_百度空间
  • GRUB for DOS 磁盘仿真命令简介
  • 来源: 作者: 发布时间:2007-12-25 15:29:14
  • 在进入正题之前,先看看 GRUB for DOS 各系列版本的差异。

    GRUB for DOS 0.0.x 系列是没有所有磁盘仿真扩展功能的版本,功能上xx等价于 GNU GRUB。这里说明,GNU GRUB 本身就有磁盘映射功能。磁盘映射是一种特别的磁盘仿真。磁盘映射只能把一个 BIOS 磁盘号码映射到另外一个 BIOS 磁盘号码,也就是说,他只能整盘整盘地仿真,不能用磁盘中的一个文件来仿真另外一个磁盘。这个版本也是xxx可靠的,能认为,GNU GRUB 有多安全,GRUB for DOS 0.0.x 就有多安全。

    GRUB for DOS 0.1.x 系列具有 0.0.x 的全部功能,除此之外还具有软盘仿真扩展。不过只能用硬盘上的 img 文件来仿真 1.44M 的软盘,并且对软盘映象进行了写保护,也就是说禁止软件通过 int13 接口写入软盘的映象。这个版本也没有已知的安全问题。

    GRUB for DOS 0.2.x 系列增加了任意规格的软盘和硬盘的仿真功能,是功能上比较完善的版本。他和 0.1.x 系列的{zd0}不同之处是,他默认时不再保护被仿真的磁盘映像。如果想获得和 0.1.x 等价的功能,必须为 map 命令加上 --read-only 参数。【注:0.1.x 系列也支持 --read-only 参数,但即使没有这个参数,0.1.x 系列也会自动保护磁盘映象不被写入。】

    版本 0.2.x 虽然支持写入虚拟磁盘映象,不过,格式化虚拟磁盘映象的 int13/AH=05h 功能并未完整实现。当格式化磁道的时候,GRUB for DOS 0.2.x 并不真的采取所有实质性的格式化动作,也即,他并不改动虚拟磁盘中的所有扇区的内容,而仅仅即时返回“格式化成功”的(类似于 fake write 的虚假)消息给调用者。这没有太大的问题。只有一点需要注意:当你在 DOS/Win98 下要格式化虚拟磁盘的时候,你先不要忙着下达格式化命令,而是要首先运行删除命令,将虚拟磁盘根目录下的所有文件及所有目录都删去,变成一个空盘,然后再下达格式化命令,这样,格式化后的虚拟磁盘能够正常使用。否则,格式化之前的垃圾目录项仍然在残存着,这将影响虚拟盘的正常使用。

    由于版本 0.2.x 支持写入虚拟磁盘,所以,对虚拟磁盘边界的检查是必不可少的一个步骤了。程式已对此作了保护。当试图读取或写入超过虚拟磁盘边界的那些扇区的时候,int13 接口会返回失败信息“扇区未找到”,而不是真的读取或写入(!!)硬盘上紧接着虚拟磁盘映象后面的扇区内容。【读取这些越界的扇区,并无实质性的危险;但写入这些越界的扇区,将给硬盘带来灾难。所以这个保护是必须的。】

    有关 GRUB for DOS 0.0.x 系列的说明文件,请看这里:

    有关 GRUB for DOS 0.1.x 系列的说明文件,请看这里:

    从这里下载 GRUB for DOS:

    (英文主页,感谢 Wengier!)

    也即:

    接下来,本文只讨论 GRUB for DOS 0.2.x 系列的新功能。

    首先,安全的考虑。在版本 0.1.x 的时候,由于只仿真了软盘,并且以只读的方式访问,所以,安全问题不非常重要。然而,0.2.x 大大不同了,他不仅能写入软盘,并且默认就打开了这个功能。所以,如果你不注意的话,你有可能因此而遇见麻烦。大致有以下几种情况:

    一、如果你的程式(或病毒)要写入软盘,那么你的软盘映象可能会改动内容,这可能不是你想要的结果。

    二、如果你仿真了硬盘,进入 视窗系统98 之后,硬盘的号码可能会发生错位【比如 BIOS 磁盘 0x81 变成了 0x82 等等】。这时候如果写入了硬盘映象,可能导致另外一个真实硬盘被破坏掉。这里看到,如果加上 --read-only 参数,安全性仍然能得到比较好的保障。

    三、即使如上述“二”所说加上了只读参数,也仍然存在一定的安全隐患,其原因是,Win98 将我们的 int13 仿真程式当作病毒来对待【在 www.google.com 中查找 MBRint13 就能找到这类信息】,因此,win98 有可能故意产生某些错误来破坏我们的 int13 的运作。迄今为止并未发现“在加上只读参数后,Win98 仍然破坏磁盘映象”的现象,但也不能确保{jd1}安全。

    四、在整盘映射的情况,加上 --read-only 参数之后,被仿真的磁盘在 DOS 下是只读的,不过在 win98 下不是只读的。这是因为 win98 对于“整盘映射”实施的是“32位磁盘存取”【应当叫做“保护模式磁盘存取”】,他不使用 BIOS,因此他不知道我们加上了 --read-only 参数,所以他会写入磁盘。有鉴于此,所以,在整盘映射的情况下不要使用 --read-only 参数【当然,使用 --read-only 参数并无所有坏处】。

    五、如果没有对硬盘进行仿真,也就是说仅仅使用了类似于 map DESTINATION (fd0) 的软盘仿真命令,那么,在 DOS 下应当是比较安全的。然而,如果要在仿真之后运行 win98,请注意这样一个顺序:首先用 map --read-only DESTINATION (fd0) 来运行,当你能够确认 win98 能正常读出仿真软盘的内容之后,下一次运行 map 命令的时候就能不再添加 --read-only 参数了。如果不能读出仿真软盘的内容,那就说明读错了位置【可能读出的是别的磁盘上的扇区】,这预示着“写入仿真软盘”将会带来灾难。所以建议在运行 win98 时先用 --read-only 参数进行确认,确保安全。

    对于版本 0.2.x 来说,如果某个问题只是引起“死机”,这不被认为是安全问题。只有当某个磁盘扇区被破坏掉了的时候,才算作安全问题。

    使用软盘仿真的情况较多,所以,主要用软盘仿真的例子来说明磁盘仿真命令的用法。

    1。把硬盘上某个盘符(例如 C:)仿真为 A:,并从 C: 盘引导 win98:

    map --read-only (hd0,0)+1 (fd0)
    chainloader (hd0,0)+1
    rootnoverify (hd0)
    boot

    上述 (hd0,0) 是 Win98 下的 C: 盘。进入 Win98 后能发现,目前 A: 盘的内容跟 C: 盘xx相同。这时,如果随意在 A: 盘上删除文件,会导致 C: 盘也删除该文件,因而有可能引起故障(例如死机)。

    map 命令中,(hdm,n)+1 被解释为代表整个 (hdm,n) 分区,而不仅仅是代表分区的{dy}个扇区。相比之下,在其他地方,(hdm,n)+1 仍然只代表分区的{dy}扇区。

    2。把硬盘上某个盘符(例如 C:)仿真为 A:,并从 A: 盘引导 win98:

    map --read-only (hd0,0)+1 (fd0)
    map --hook
    chainloader (fd0)+1
    rootnoverify (fd0)
    boot

    此处需要用 map --hook 命令xx A: 盘的就地仿真。如果没有 map --hook 命令,那么后续的 chainloader (fd0)+1 命令就要寻找真实软驱的软盘介质上的内容,而不是我们想要的虚拟软盘上的内容。
    {zh1}一条 rootnoverify (fd0) 告诉引导程式说,我们是从软盘启动机器的。

    3。把硬盘上某个 img 文件仿真为 A:,并从 C: 盘引导 win98

    map --read-only (hd0,0)/file.img (fd0)
    chainloader (hd0,0)+1
    rootnoverify (hd0)
    boot

    4。把硬盘上某个软盘 img 文件仿真为 A:,并用该 img 映象里面的文件 dos.img 来引导机器:

    map --read-only (hd0,0)/file.img (fd0)
    map --hook
    chainloader (fd0)/dos.img
    rootnoverify (fd0)
    boot

    此处,file.img 是 C: 盘上的一个软盘映像文件,在这个映象文件中,包含了一个叫做 dos.img 的文件。如果不用 map --hook 命令(该命令启用了就地仿真功能),则无法在后续的 grub 命令行中访问 dos.img 文件。这个例子只是说明 map --hook 命令的作用,我们通常是不会用到这个例子中的方法的。


    上述命令中,软盘能是任意的规格,任意的大小。

    下面举一个硬盘仿真的例子,不过{zj0}不要启动 win98,而应当只限于启动 DOS:

    map --read-only (hd2,6)+1 (hd0)
    map --hook
    chainloader (hd0,0)+1
    rootnoverify (hd0)
    boot

    这里,(hd2,6)+1 是第三块硬盘上的某个逻辑 DOS 分区。“map (hd2,6)+1 (hd0)”命令将扩展 DOS 分区仿真为 BIOS 的 0x80 号硬盘。xx就地仿真【map --hook】之后,“chainloader (hd0,0)+1”中的 (hd0,0)+1 就是仿真之后的虚拟 0x80 硬盘分区,而不是仿真之前的 0x80 号硬盘分区了。【此处的 (hd0,0)+1 实际上就是仿真之前的 (hd2,6)+1】。你应当确保这时在该分区中存在着 DOS,否则引导会失败。如果你不启动 win98,能不用 --read-only 参数。如果试图启动 win98,通常会引导失败。

    因为 MS-DOS 的逻辑分区之前的 63 个扇区处,都存放了一个“扩展分区的分区表”,所以有可能用他来仿真一个硬盘。“扩展分区表”中的引导记录全都是 00 字节。GRUB for DOS 0.2.x 在读取这个分区表的时候,作了一些修改,使得这个表看起来像是个合法的硬盘主分区表。GRUB for DOS 并不写入该扇区,因为默认的 safeboot 在起作用。这是安全的。在这种情况下不应当加入 --unsafe-boot 选项,因为 win98 会随意写入虚拟磁盘的引导扇区,这将导致该分区表信息的错位,造成扩展分区不可访问的后果【内容还在,只是扩展分区表错误导致不可访问。手动修改扩展分区表能解决这个问题,但需要计算准确】。

    上述硬盘仿真的例子,如果改成下面的方式,这将是失败的:

    map --read-only (hd2,6)+1 (hd0)
    chainloader (hd2,6)+1
    rootnoverify (hd0)
    boot

    分区 (hd2,6) 的 DOS 引导记录中有一个“隐含扇区”的字段,这个字段必须修改。如果没有 map --hook 命令,该字段不会被正确修改,因而将导致引导失败。修改该字段的程式,是在 int13 的中断处理程式中,所以需要 map --hook 之后再读出该扇区的内容【此时所读出的该扇区内容已经过恰当修改了】。在 map --hook 之后,应当使用 chainloader (hd0,0)+1 来装入仿真之前的 (hd2,6)+1,直接用 chainloader (hd2,6)+1 是错误的【直接用 chainloader (hd2,6)+1 结果,使得该扇区不能利用 int13 的中断处理程式进行必要的修改,这将导致引导失败】。注意,int13 仅对磁盘 (hd0) 起作用,对 (hd2) 不起作用,这是因为 map --read-only (hd2,6)+1 (hd0) 命令只对 (hd0) 进行了仿真,而对其他磁盘【包括(hd2)】都没有进行仿真。所以,int13 程式会修改 (hd0,0)+1 但不修改 (hd2,6)+1。

    又,上述“修改”并不发生在磁盘上,而是发生在内存中。所以,磁盘上的扇区内容不会改动。也就是说,当读取该扇区的时候,要对读出的扇区进行修改,从而确保扇区内容可用;而当写入扇区的时候,由于默认的 safeboot 在起作用,所以,不会有写入的动作,直接返回虚假的“写入成功”的消息。

    前面已解释过了,safeboot 只保护硬盘 MBR 主引导扇区及硬盘{dy}个主分区的{dy}个扇区(通常是 DOS 的引导扇区)——只保护这两个扇区,不保护其他扇区。

    GRUB for DOS 0.2.0 还包括了 BOOTGRUB 和 GRLDR 文件【他们叫做“GRUB for NTLDR”】。这两个文件用于从 视窗系统 NT/2000/XP/2003 的引导菜单中直接启动 GRUB。用法是,将 BOOTGRUB 和 GRLDR 拷贝到 视窗系统 NT/2000/XP/2003 的 C: 盘根目录【C:盘根目录下应当有隐藏的 NTLDR 和 BOOT.INI 文件】,然后修改 BOOT.INI 文件,一般是在 BOOT.INI 文件尾部添加类似如下的一行:

    C:\BOOTGRUB="启动GRUB"

    重新启动机器,选择相应的菜单项就进入 GRUB 了。


    安全建议(这是以前写的,目前还保留他,或许这是引起注意的一个好办法):
       1。如果你用 GRUB for DOS,请尽量用版本 0.0.x 的,不要用更高的。
       2。如果你不用 0.0.x 的,请尽量用版本 0.1.x 的,不要用更高的。
       3。如果你不用 0.1.x 的,请尽量用版本 0.2.x 的,不要用更高的。
       4。如果你用 0.2.x 的版本,请尽量不要用 map 等磁盘仿真命令。
       5。如果你用 0.2.x 的版本,也用了 map 命令,请尽量先在虚拟机中测试运行。
       6。版本 0.2.x 在你的虚拟机中测试过了之后,在真实机器中尽量用 --read-only 等参数运行。
       7。尽管已把 map 命令加上了 --read-only 等参数,但也请尽量不要启动 视窗系统。
       8。如果要启动 视窗系统,请尽量不要把用来仿真的 img 映像安置在 (hd0) 驱动器上。
       9。如果启动了 视窗系统,即便仿真磁盘的映像不在 (hd0) 驱动器上,你也得做好最坏的打算:其一,如果仿真映像被毁,你不要感到出乎意料;其二,如果某个真实磁盘全部被毁,你不要感到难以接受;其三,如果你的所有的、全部的硬盘都报废了,你也不要感到太奇怪。
       10。版本 0.2.x 以后的仿真技术是给熟练的计算机玩家作为研究的目的来使用的,不是给普通用户使用的。
       11。玩家们{zj0}互相交流经验,研究别人在使用过程中失败的情况,周详阅读说明文件,避免使自己遭受不必要的损失。

       在初期的测试中暴露出非常多问题,也损坏过非常多硬盘,所以在这里特别通报一下,并写出了上述注意事项。


    map 命令的新功能是有某种危险的,建议首先在 VMware 或 Virtual PC 这类虚拟机中测试。先用 --read-only 或 --fake-write 参数运行 map 命令,这样是在只读状态下测试,安全一些。只读测试一段时间后,没有问题的话,再进行全方面测试。测试时,在 grub 所仿真的虚拟磁盘上安装 DOS/Win9x/Me,不要用别的操作系统。即使全部测试都成功,这个仿真技术也仍然有着他固有的危险性。这是基于 BIOS 的仿真,不是全方位的仿真。例如,当你格式化一个磁盘的时候,你得明白这个磁盘是不是仿真了的? 及你所用的格式化软件是使用 BIOS 呢? 还是使用磁盘 IO 端口读写? 使用 BIOS 的格式化软件,在仿真之下是安全的。使用磁盘 IO 端口的格式化软件,当他格式化一个仿真了的磁盘时,在最坏的情况下,实际上会格式化你的真实硬盘,至于说这种危险的误操作会发生在哪个硬盘上,取决于使用了什么样的 map 命令集(参考下面的“技术细节和实现方法”一节)。更进一步的测试,请大家报告 DOS 的 format 命令、视窗系统 资源管理器的格式化命令、磁盘碎块整理命令等等,及第三方生产的 HD-COPY 等工具软件在进行格式化操作时是否安全。




  • 郑重声明:资讯 【GRUB for DOS 磁盘仿真命令简介_大灰狼工作室_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
    —— 相关资讯 ——